diff --git a/.github/scripts/check-provider-startup.py b/.github/scripts/check-provider-startup.py new file mode 100644 index 000000000..e803ae200 --- /dev/null +++ b/.github/scripts/check-provider-startup.py @@ -0,0 +1,115 @@ +"""Start installed providers without inference and verify the selected OpenAI major.""" + +from __future__ import annotations + +import argparse +import asyncio +import logging +import os +from importlib.metadata import version + +from pydantic import BaseModel +from wheelchecks import Framework + +logger = logging.getLogger(__name__) +MODEL_ID = "gpt-4o-mini" +API_KEY = "test" + + +async def start_pydantic_ai() -> None: + import httpx2 # noqa: PLC0415 -- only modern consumers install HTTPX2 + from pydantic_ai.models import infer_model # noqa: PLC0415 -- optional consumer dependency + + from band.adapters.pydantic_ai import ( # noqa: PLC0415 -- only the Pydantic AI consumer installs this adapter + PydanticAIAdapter, + PydanticAIAdapterConfig, + ) + + for alias in ("openai", "openai-chat"): + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model=f"{alias}:{MODEL_ID}") + ) + await adapter.on_started("Wheel consumer", "Provider startup check") + assert adapter._agent is not None + async with adapter._agent: + model = infer_model(f"{alias}:{MODEL_ID}") + assert isinstance(model.provider.client._client, httpx2.AsyncClient) + + +async def start_crewai() -> None: + from crewai import LLM # noqa: PLC0415 -- only the CrewAI consumer installs this provider + + LLM(model=f"openai/{MODEL_ID}", api_key=API_KEY) + + +async def start_strands() -> None: + from strands.models.openai_responses import OpenAIResponsesModel # noqa: PLC0415 -- only the Strands consumer installs this provider + + OpenAIResponsesModel(model_id=MODEL_ID, client_args={"api_key": API_KEY}) + + +async def start_nooa() -> None: + from nooa.unifiedllm.registry import get_llm_client # noqa: PLC0415 -- only the NOOA consumer installs this provider + + get_llm_client(f"openai/{MODEL_ID}", api_key=API_KEY) + + +async def start_langgraph() -> None: + from langchain_openai import ChatOpenAI # noqa: PLC0415 -- only LangGraph consumers install this provider + + model = ChatOpenAI(model=MODEL_ID, api_key=API_KEY) + await model.root_async_client.close() + model.root_client.close() + + +async def start_parlant() -> None: + import httpx2 # noqa: PLC0415 -- only modern consumers install HTTPX2 + from parlant.adapters.nlp.openai_service import OpenAIService # noqa: PLC0415 -- only the Parlant consumer installs this provider + from parlant.core.loggers import StdoutLogger # noqa: PLC0415 -- optional consumer dependency + from parlant.core.meter import LocalMeter # noqa: PLC0415 -- optional consumer dependency + from parlant.core.tracer import LocalTracer # noqa: PLC0415 -- optional consumer dependency + + tracer = LocalTracer() + provider_logger = StdoutLogger(tracer) + service = OpenAIService(provider_logger, tracer, LocalMeter(provider_logger)) + generator = await service.get_schematic_generator(BaseModel) + assert isinstance(generator._client._client, httpx2.AsyncClient) + await generator._client.close() + + +async def start_provider(framework: Framework) -> None: + match framework: + case Framework.PYDANTIC_AI: + await start_pydantic_ai() + case Framework.CREWAI: + await start_crewai() + case Framework.STRANDS: + await start_strands() + case Framework.NOOA: + await start_nooa() + case Framework.LANGGRAPH: + await start_langgraph() + case Framework.PARLANT: + await start_parlant() + logger.info("%s provider starts", framework) + + +async def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--framework", type=Framework, choices=Framework, action="append", required=True + ) + parser.add_argument("--openai-major", type=int, required=True) + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(message)s") + selected_version = version("openai") + assert int(selected_version.split(".")[0]) == args.openai_major, selected_version + # Upstream string-based providers read this; no real credentials or inference are needed. + os.environ["OPENAI_API_KEY"] = API_KEY + for framework in args.framework: + await start_provider(framework) + logger.info("OpenAI %s: provider startup checks passed", selected_version) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/.github/scripts/check-wheel-extras.py b/.github/scripts/check-wheel-extras.py new file mode 100644 index 000000000..e069002cf --- /dev/null +++ b/.github/scripts/check-wheel-extras.py @@ -0,0 +1,100 @@ +"""Verify clean wheel installs, provider startup, and incompatible-extra rejection. + +Run outside the repository resolver: each case gets a fresh virtual environment +and installs the built wheel through its published Requires-Dist metadata. +""" + +from __future__ import annotations + +import argparse +import logging +import subprocess +import sys +import tempfile +from pathlib import Path + +from wheelchecks import CONSUMERS, Consumer, Framework + +logger = logging.getLogger(__name__) +PROVIDER_PROBE = Path(__file__).with_name("check-provider-startup.py") + + +def run(command: list[str], cwd: Path) -> subprocess.CompletedProcess[str]: + result = subprocess.run( + command, cwd=cwd, text=True, capture_output=True, check=False + ) + logger.info("$ %s\n%s%s", " ".join(command), result.stdout, result.stderr) + return result + + +def require_success(command: list[str], cwd: Path) -> None: + result = run(command, cwd) + if result.returncode != 0: + raise RuntimeError(f"Wheel consumer check failed: {command}") + + +def install_consumer(wheel: Path, consumer: Consumer, python: Path, cwd: Path) -> None: + requirements = [f"{wheel}[{consumer.extras}]"] + if consumer.openai_major == 3: + requirements.append("openai>=3.26,<4") + require_success( + ["uv", "pip", "install", "--python", str(python), *requirements], cwd + ) + require_success(["uv", "pip", "check", "--python", str(python)], cwd) + + +def check_providers(consumer: Consumer, python: Path, cwd: Path) -> None: + framework_flags = [ + value + for framework in consumer.frameworks + for value in ("--framework", str(framework)) + ] + require_success( + [ + str(python), + str(PROVIDER_PROBE), + "--openai-major", + str(consumer.openai_major), + *framework_flags, + ], + cwd, + ) + + +def check_incompatible_extras( + wheel: Path, consumer: Consumer, python: Path, cwd: Path +) -> None: + extras = f"{Framework.PYDANTIC_AI},{consumer.extras}" + result = run( + ["uv", "pip", "install", "--python", str(python), f"{wheel}[{extras}]"], cwd + ) + if result.returncode == 0 or "No solution found" not in result.stderr: + raise RuntimeError("Incompatible extras did not fail dependency resolution") + logger.info("Incompatible extras rejected: %s", extras) + + +def check_consumer(wheel: Path, consumer: Consumer) -> None: + with tempfile.TemporaryDirectory(prefix="band-wheel-") as directory: + cwd = Path(directory) + environment = cwd / "venv" + require_success(["uv", "venv", "--python", "3.12", str(environment)], cwd) + python = environment / ( + "Scripts/python.exe" if sys.platform == "win32" else "bin/python" + ) + install_consumer(wheel, consumer, python, cwd) + check_providers(consumer, python, cwd) + if consumer.rejects_pydantic_ai: + check_incompatible_extras(wheel, consumer, python, cwd) + + +def main() -> None: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("wheel", type=Path) + parser.add_argument("--case", choices=CONSUMERS, required=True) + args = parser.parse_args() + logging.basicConfig(level=logging.INFO, format="%(message)s") + check_consumer(args.wheel.resolve(), CONSUMERS[args.case]) + + +if __name__ == "__main__": + main() diff --git a/.github/scripts/wheelchecks.py b/.github/scripts/wheelchecks.py new file mode 100644 index 000000000..675632048 --- /dev/null +++ b/.github/scripts/wheelchecks.py @@ -0,0 +1,46 @@ +"""Declared wheel-consumer combinations and their expected OpenAI compatibility.""" + +from __future__ import annotations + +import json +import sys +from dataclasses import dataclass +from enum import StrEnum + + +class Framework(StrEnum): + PYDANTIC_AI = "pydantic-ai" + CREWAI = "crewai" + STRANDS = "strands" + NOOA = "nooa" + LANGGRAPH = "langgraph" + PARLANT = "parlant" + + +@dataclass(frozen=True) +class Consumer: + frameworks: tuple[Framework, ...] + openai_major: int + rejects_pydantic_ai: bool = False + + @property + def extras(self) -> str: + return ",".join(self.frameworks) + + +CONSUMERS: dict[str, Consumer] = { + consumer.extras.replace(",", "-"): consumer + for consumer in ( + Consumer((Framework.PYDANTIC_AI,), 3), + Consumer((Framework.CREWAI,), 2, rejects_pydantic_ai=True), + Consumer((Framework.STRANDS,), 2, rejects_pydantic_ai=True), + Consumer((Framework.NOOA,), 2, rejects_pydantic_ai=True), + Consumer((Framework.LANGGRAPH, Framework.STRANDS), 2, rejects_pydantic_ai=True), + Consumer((Framework.LANGGRAPH,), 3), + Consumer((Framework.PARLANT,), 3), + ) +} + + +if __name__ == "__main__": + sys.stdout.write(json.dumps({"case": list(CONSUMERS)}) + "\n") diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1cf26d457..c0830d6ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,10 +102,10 @@ jobs: # Linux-only: doc snippets are OS-independent, and this step relies on # git ls-files globbing that we don't need to re-run per platform. if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12' - # examples/ READMEs have illustrative fragments not yet snippet-testable + # NOOA snippets run in test-strands-nooa; examples/ READMEs are illustrative. run: | # shellcheck disable=SC2046 # word-splitting the ls-files output is the point - uv run --all-packages pytest --markdown-docs $(git ls-files '*.md' ':!:examples/*') --no-cov + uv run --all-packages pytest --markdown-docs $(git ls-files '*.md' ':!:examples/*' ':!:docs/adapters/nooa.md') --no-cov test-crewai: @@ -177,6 +177,79 @@ jobs: src/band/integrations/crewai/ + test-strands-nooa: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + python-version: ['3.11', '3.12', '3.13'] + fail-fast: false + + # Use bash on every OS so the multiline pytest and pyrefly commands stay + # identical across Linux and Windows. + defaults: + run: + shell: bash + + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Configure git to use HTTPS for GitHub + uses: ./.github/actions/git-https-auth + + - name: Install uv + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 + with: + enable-cache: true + cache-dependency-glob: "**/pyproject.toml" + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Strands and NOOA dependencies + run: uv sync --all-packages --locked --extra dev-strands-nooa + + - name: Collect baseline E2E in the Strands and NOOA environment + env: + BAND_ALLOW_MISSING_FRAMEWORKS: "1" + BAND_TEST_EXTRA: "dev-strands-nooa" + run: uv run --all-packages pytest tests/e2e/baseline/ --collect-only -q --no-cov + + - name: Run Strands and NOOA tests + env: + # dev-strands-nooa lacks modern framework packages; + # tolerate missing framework configs instead of failing fast. + BAND_ALLOW_MISSING_FRAMEWORKS: "1" + BAND_TEST_EXTRA: "dev-strands-nooa" + run: | + uv run --all-packages pytest \ + tests/adapters/test_strands_adapter.py \ + tests/adapters/nooa/ \ + tests/converters/test_strands.py \ + tests/framework_conformance/ -k 'strands or nooa or legacy or probe_registry' + + - name: Verify selected Strands and NOOA coverage + env: + BAND_ALLOW_MISSING_FRAMEWORKS: "1" + BAND_TEST_EXTRA: "dev-strands-nooa" + run: uv run --all-packages pytest tests/framework_conformance/test_strands_nooa_job_coverage.py + + - name: Run NOOA markdown examples + if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12' + run: uv run --all-packages pytest --markdown-docs docs/adapters/nooa.md --no-cov + + - name: Pyrefly check (Strands and NOOA sources) + run: | + uv run --all-packages pyrefly check \ + src/band/adapters/strands.py \ + src/band/converters/strands.py \ + src/band/adapters/nooa/ \ + src/band/converters/nooa.py + + test-parlant: runs-on: ${{ matrix.os }} strategy: @@ -369,3 +442,39 @@ jobs: - name: Verify band-mcp CLI entry point run: /tmp/band-mcp-install/bin/band-mcp --version + + + wheel-extra-cases: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.cases.outputs.matrix }} + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - name: Set up Python + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: '3.12' + - name: Resolve wheel consumer cases + id: cases + run: echo "matrix=$(python3 .github/scripts/wheelchecks.py)" >> "$GITHUB_OUTPUT" + + wheel-extras: + needs: wheel-extra-cases + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.wheel-extra-cases.outputs.matrix) }} + steps: + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - name: Install uv + uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 + - name: Set up Python + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 + with: + python-version: '3.12' + - name: Build wheel + run: uv build --wheel + - name: Check published extras and provider startup + run: python3 .github/scripts/check-wheel-extras.py dist/band_sdk-*.whl --case ${{ matrix.case }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 0e66e8734..5910dfcf2 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -45,7 +45,8 @@ name: E2E (baseline) # inside the pytest process; the container reaches it back via # host.docker.internal. Own lane (shares the `dev` extra) for the # server it stands up. -# - nooa — NooaAdapter (NVIDIA NOOA). Shares the `dev` extra, which installs +# - strands — Strands Responses provider on OpenAI 2 (`dev-strands-nooa`). +# - nooa — NooaAdapter (NVIDIA NOOA). Shares the `dev-strands-nooa` extra, which installs # NOOA only on Python 3.12-3.13 off Windows (it imports fcntl), so # the lane is Linux-only. # @@ -79,6 +80,7 @@ on: - google - backends - letta + - strands - nooa - parlant os: @@ -190,10 +192,9 @@ jobs: # @pytest.mark.timeout(extra=...). See tests/e2e/baseline/conftest.py. # The registry scopes which adapters run in this lane. BAND_E2E_LANE: ${{ matrix.lane }} - # The dev-crewai and dev-parlant venvs each lack the other frameworks; - # tolerate missing framework configs there instead of failing fast (mirrors - # ci.yml's crewai and parlant jobs). - BAND_ALLOW_MISSING_FRAMEWORKS: ${{ (matrix.extra == 'dev-crewai' || matrix.extra == 'dev-parlant') && '1' || '0' }} + # Isolated extras lack modern frameworks; their owning jobs verify + # required configs while tolerating other environments' dependencies. + BAND_ALLOW_MISSING_FRAMEWORKS: ${{ (matrix.extra == 'dev-crewai' || matrix.extra == 'dev-parlant' || matrix.extra == 'dev-strands-nooa') && '1' || '0' }} # Secrets carry an E2E_ prefix in GitHub (so they're clearly scoped to this # workflow), but the code reads the unprefixed names — the mapping happens # here: the env var keeps its code-expected name, the secret is prefixed. diff --git a/AGENTS.md b/AGENTS.md index 59a2a888d..9b571bb0f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -187,12 +187,15 @@ To wire a new framework adapter into the matrix, follow ## Commands ```bash -# Install dependencies (all extras except crewai and parlant — see Dependency Conflicts below) +# Install dependencies (modern frameworks; see Dependency Conflicts below) uv sync --extra dev # Install crewai adapter deps (isolated from dev/parlant/pydantic-ai) uv sync --extra dev-crewai +# Install Strands/NOOA adapter deps in their OpenAI-2 environment +uv sync --extra dev-strands-nooa + # Install parlant adapter deps (isolated from dev/crewai/pydantic-ai) uv sync --extra dev-parlant @@ -230,9 +233,13 @@ uv run pyrefly check environment (crewai's exact `~=` pins on `mcp`, `aiofiles`, `regex` and `tomli` drag the whole lock), and **parlant cannot coexist with pydantic-ai** either (a `griffe`/`griffelib` namespace collision uv cannot see as a version conflict). -That's why there are three separate extras — `dev` (everything except crewai -and parlant), `dev-crewai`, `dev-parlant` — each installed in its own CI -job/venv. The `[tool.uv] conflicts` comments in `pyproject.toml` carry the +Strands and NOOA/LiteLLM require OpenAI 2, while modern Pydantic AI requires +OpenAI 3. There are four isolated development extras: `dev` (modern frameworks), +`dev-strands-nooa` (Strands, conditional NOOA, and their LangGraph peer), `dev-crewai`, +and `dev-parlant`. Each has its own CI job/venv. Public LangGraph and Parlant +remain compatible with either OpenAI major; LangGraph + Strands is supported. +Use `uv run --locked --isolated --python 3.12 --all-packages --extra ` +for concurrent work so one lane never overwrites another lane's environment. The `[tool.uv] conflicts` comments in `pyproject.toml` carry the mechanism. ## Environment Variables @@ -264,7 +271,7 @@ agent keys and platform URLs should stay aligned with `.env.test` / Baseline lane scoping (see `tests/e2e/baseline/README.md`): -- `BAND_E2E_LANE`: The CI lane (a job: a `uv` extra + optional server/CLI setup) to scope the run to. Lane ids are content-based and decoupled from the `uv` extra — `core` (anthropic/openai-family adapters plus `copilot_sdk`, which self-downloads its CLI runtime and uses Anthropic BYOK without GitHub auth; `dev` extra), `crewai` (`dev-crewai` extra), `google` (gemini/google_adk, split out for rate-limit isolation), `backends` (codex, opencode, copilot_acp, and cursor_acp coding agents), `letta` (self-hosted letta server), `nooa` (NOOA, Linux-only: it imports `fcntl`), `parlant` (`dev-parlant` extra — split from `core` because parlant's griffe/griffelib transitive deps collide with pydantic_ai's; registers no matrix adapter, a bespoke `@lane`-pinned smoke only). Resolves the lane's adapters from the registry (`ci_lanes()`, derived from each adapter's `requires`); out-of-lane adapters skip-with-reason (they're covered by their own lane) while in-lane adapters keep fail-loud (an unwired backend stays red). Unset (the local default) = full matrix, no scoping. CI never lists adapters — it derives lanes from the registry. A test's lane is derived from **all** the frameworks it touches (a matrix cell's adapter plus its `@per_adapter(peer=...)`, or a `@with_adapters` set); a test whose frameworks span more than one home lane fails collection (`assert_every_item_is_schedulable`) unless pinned with `@lane(Lane.X)` to a lane whose extra hosts them all. To add a lane, see `tests/e2e/baseline/README.md` ("Adding a CI lane"). +- `BAND_E2E_LANE`: The CI lane (a job: a `uv` extra + optional server/CLI setup) to scope the run to. Lane ids are content-based and decoupled from the `uv` extra — `core` (anthropic/openai-family adapters plus `copilot_sdk`, which self-downloads its CLI runtime and uses Anthropic BYOK without GitHub auth; `dev` extra), `crewai` (`dev-crewai` extra), `google` (gemini/google_adk, split out for rate-limit isolation), `backends` (codex, opencode, copilot_acp, and cursor_acp coding agents), `letta` (self-hosted letta server), `strands` (`dev-strands-nooa` extra), `nooa` (same `dev-strands-nooa` extra, Linux-only: it imports `fcntl`), `parlant` (`dev-parlant` extra — split from `core` because parlant's griffe/griffelib transitive deps collide with pydantic_ai's; registers no matrix adapter, a bespoke `@lane`-pinned smoke only). Resolves the lane's adapters from the registry (`ci_lanes()`, derived from each adapter's `requires`); out-of-lane adapters skip-with-reason (they're covered by their own lane) while in-lane adapters keep fail-loud (an unwired backend stays red). Unset (the local default) = full matrix, no scoping. CI never lists adapters — it derives lanes from the registry. A test's lane is derived from **all** the frameworks it touches (a matrix cell's adapter plus its `@per_adapter(peer=...)`, or a `@with_adapters` set); a test whose frameworks span more than one home lane fails collection (`assert_every_item_is_schedulable`) unless pinned with `@lane(Lane.X)` to a lane whose extra hosts them all. To add a lane, see `tests/e2e/baseline/README.md` ("Adding a CI lane"). Baseline provisioning/cleanup policy (see `tests/e2e/baseline/README.md`): @@ -315,9 +322,13 @@ Tracked `.md` files (except `examples/`) run in CI as tests via `pytest-markdown — so `python` snippets in the docs must stay correct and runnable, not rot: ```bash -uv run pytest --markdown-docs $(git ls-files '*.md' ':!:examples/*') --no-cov +uv run pytest --markdown-docs $(git ls-files '*.md' ':!:examples/*' ':!:docs/adapters/nooa.md') --no-cov +uv run --locked --isolated --python 3.12 --all-packages --extra dev-strands-nooa pytest --markdown-docs docs/adapters/nooa.md --no-cov ``` +NOOA's runnable documentation requires its legacy environment; the two commands +above cover the complete tracked documentation suite. + Fence tags: plain ` ```python ` **executes** (top-level `assert`s are the checks); ` ```python notest ` is collected out — reserve it for pseudo-code, placeholder names, or snippets that genuinely need a live platform/LLM; diff --git a/README.md b/README.md index e6998d7e1..72fc5332b 100644 --- a/README.md +++ b/README.md @@ -844,6 +844,27 @@ The SDK reconnects automatically and resubscribes to active rooms. No action is ### Adapter Dependency Conflicts +Pydantic AI uses OpenAI 3 and its default HTTPX2 client. Current CrewAI, Strands, +and NOOA/LiteLLM require OpenAI 2; install these in separate environments from +Pydantic AI. This is a breaking dependency compatibility change for consumers +that previously combined those extras. Adapter signatures and Band REST's +HTTPX transport remain unchanged. Injected OpenAI clients must match their +installed OpenAI major. + +LangGraph and Parlant support either major. LangGraph + Strands remains a +supported OpenAI-2 combination. Agents from separate environments can still +collaborate through Band. + +For testing, `dev` and `dev-parlant` use OpenAI 3; `dev-crewai` and `dev-strands-nooa` +use OpenAI 2. `dev-strands-nooa` contains Strands, conditional NOOA, and LangGraph. +Run isolated environments without replacing a concurrently used `.venv`: + +```bash +uv run --locked --isolated --python 3.12 --all-packages --extra dev pytest tests/ --ignore=tests/e2e/ --ignore=tests/integration/ +uv run --locked --isolated --python 3.12 --all-packages --extra dev-strands-nooa pytest tests/adapters/test_strands_adapter.py tests/adapters/nooa/ tests/framework_conformance/ -k 'strands or nooa or legacy' +``` + + Three extras are resolved separately, because crewai carries the narrowest transitive pins and they have repeatedly collided: | Pair | crewai's pin | Other side | diff --git a/pyproject.toml b/pyproject.toml index 355033dcf..6620fabc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,8 +68,8 @@ letta = [ "mcp>=1.28.1,<2", ] pydantic-ai = [ - "pydantic-ai-slim[anthropic]>=2.18.0", - "openai>=2.0.0", + "pydantic-ai-slim[anthropic,openai]>=2.55.0", + "openai>=3.26.0,<4", ] anthropic = [ "anthropic>=0.75.0,<2", @@ -78,7 +78,7 @@ langgraph = [ "langchain>=1.0.0", "langchain-core>=1.2.11", "langgraph>=1.0.0", - "langchain-openai>=0.3.0", + "langchain-openai>=1.5.0", "langchain-anthropic>=0.3.0", "langchain-community>=0.4.0", # 0.4.0+ required for langchain 1.0 compatibility "langchain-text-splitters>=0.3.0", @@ -101,7 +101,7 @@ parlant = [ ] crewai = [ "crewai==1.15.27", - "openai>=2.0.0", # crewai 1.14.3 requires openai>=2.0.0 + "openai>=2.0.0,<3", # CrewAI requires the legacy OpenAI client "nest-asyncio>=1.6.0", # Required for sync-to-async bridging in CrewAI tools "pillow>=12.1.1", ] @@ -122,7 +122,7 @@ a2a_gateway_demo = [ "starlette>=0.40.0", # HTTP server "uvicorn>=0.29", # ASGI server "langgraph>=1.0.0", # LangGraph for orchestrator agent - "langchain-openai>=0.3.0", # OpenAI model for LLM + "langchain-openai>=1.5.0", # OpenAI model for LLM "click>=8.0.0", # CLI for demo orchestrator ] acp = [ @@ -172,15 +172,17 @@ agno = [ ] strands = [ "strands-agents[openai]>=1.50.1,<2", - "openai>=2.0.0", + "openai>=2.0.0,<3", ] # NOOA supports Python 3.12 and 3.13 on POSIX only (it imports fcntl); elsewhere # the extra installs nothing. nooa = [ "nooa>=0.0.10,<0.1; python_version >= '3.12' and python_version < '3.14' and sys_platform != 'win32'", + "openai>=2.0.0,<3; python_version >= '3.12' and python_version < '3.14' and sys_platform != 'win32'", ] -# dev extra includes ALL framework deps for testing EXCEPT crewai and parlant. +# Modern dev excludes CrewAI, Parlant, Strands and NOOA. +# Strands and NOOA require OpenAI 2 and live in dev-strands-nooa. # crewai is declared conflicting with both parlant and pydantic-ai (its pydantic # ceiling and exact `~=` pins); parlant is declared conflicting with pydantic-ai # because their `griffe`/`griffelib` transitive deps are two different PyPI @@ -203,7 +205,7 @@ dev = [ "httpx>=0.24.0", # Already in main deps, for mocking "pytest-httpx>=0.35.0", # httpx_mock fixture: REST header-emission proof # Include pydantic-ai for testing - "pydantic-ai-slim>=2.18.0", + "pydantic-ai-slim[anthropic,openai]>=2.55.0", # Include anthropic for testing "anthropic>=0.75.0,<2", # Include claude_sdk for testing @@ -214,11 +216,11 @@ dev = [ "langchain>=1.0.0", "langchain-core>=1.2.11", "langgraph>=1.0.0", - "langchain-openai>=0.3.0", + "langchain-openai>=1.5.0", "langchain-anthropic>=0.3.0", "langchain-community>=0.4.0", "langchain-text-splitters>=0.3.0", - "openai>=2.0.0", + "openai>=3.26.0,<4", "beautifulsoup4>=4.12.0", # Include a2a-sdk for testing "a2a-sdk>=1.1.2,<2", @@ -241,10 +243,6 @@ dev = [ "opentelemetry-resourcedetector-gcp>=1.12.0a0,!=1.13.0", # Include Agno for testing "agno>=2.6.0", - # Include Strands Agents for testing - "strands-agents[openai]>=1.50.1,<2", - # Include NOOA for testing (Python 3.12 and 3.13, POSIX only) - "nooa>=0.0.10,<0.1; python_version >= '3.12' and python_version < '3.14' and sys_platform != 'win32'", # Include letta-client for testing "letta-client>=1.0.0", # Include bridge deps for testing @@ -286,7 +284,7 @@ dev-crewai = [ "httpx>=0.24.0", # CrewAI and its deps "crewai==1.15.27", - "openai>=2.0.0", + "openai>=2.0.0,<3", "nest-asyncio>=1.6.0", "pillow>=12.1.1", # Anthropic client: the baseline E2E conftest imports it at module load and @@ -318,7 +316,7 @@ dev-parlant = [ "httpx>=0.24.0", # Parlant and its deps (see the parlant extra for why >=3.3.2) "parlant>=3.3.2", - "openai>=2.0.0", + "openai>=3.26.0,<4", "werkzeug>=3.1.6", # Anthropic client: the baseline E2E conftest imports it at module load and # the LLM judge needs it. A thin client (pydantic <3), so no parlant conflict. @@ -332,6 +330,42 @@ dev-parlant = [ "pyrefly>=0.18.0", ] +# OpenAI-2 frameworks share test tooling and retain separate E2E lanes. +dev-strands-nooa = [ + "pydantic-settings>=2.0.0", + "pytest>=7.0.0", + "pytest-markdown-docs>=0.9.2", + "pytest-asyncio>=0.21.0", + "looptime>=0.7", + "pytest-mock>=3.10.0", + "pytest-cov>=4.0.0", + "pytest-rerunfailures>=14.0.0", + "tenacity>=8.0.0", + "pytest-timeout>=2.4.0", + "band-testing-python==0.1.4", + "httpx>=0.24.0", + # OpenAI-2 frameworks and their LangGraph peer + "strands-agents[openai]>=1.50.1,<2", + "nooa>=0.0.10,<0.1; python_version >= '3.12' and python_version < '3.14' and sys_platform != 'win32'", + "openai>=2.0.0,<3", + # Shared clients for baseline collection and the judge. + "anthropic>=0.75.0,<2", + "a2a-sdk>=1.1.2,<2", + "langchain>=1.0.0", + "langchain-core>=1.2.11", + "langgraph>=1.0.0", + "langchain-openai>=1.5.0", + "langchain-anthropic>=0.3.0", + "langchain-community>=0.4.0", # 0.4.0+ required for langchain 1.0 compatibility + "langchain-text-splitters>=0.3.0", + "beautifulsoup4>=4.12.0", + # Pretty E2E test output + "rich>=13.0.0", + # Development tools + "ruff>=0.8.0", + "pyrefly>=0.18.0", +] + [project.scripts] band-acp = "band.integrations.acp.cli:entry_point" band-kit = "band.docker.provision:main" @@ -477,6 +511,15 @@ conflicts = [ { extra = "dev-parlant" }, { extra = "crewai" }, ], + [{ extra = "dev" }, { extra = "strands" }], + [{ extra = "dev" }, { extra = "nooa" }], + [{ extra = "dev" }, { extra = "dev-strands-nooa" }], + [{ extra = "pydantic-ai" }, { extra = "strands" }], + [{ extra = "pydantic-ai" }, { extra = "nooa" }], + [{ extra = "pydantic-ai" }, { extra = "dev-strands-nooa" }], + [{ extra = "dev-parlant" }, { extra = "strands" }], + [{ extra = "dev-parlant" }, { extra = "nooa" }], + [{ extra = "dev-parlant" }, { extra = "dev-strands-nooa" }], ] [tool.ruff.lint] @@ -523,6 +566,8 @@ project_excludes = [ ignore-missing-imports = [ "crewai.*", "parlant.*", + "strands.*", + "nooa.*", "nest_asyncio", ] # Disable the default **/.[!/.]*/** exclude so pyrefly works inside diff --git a/src/band/adapters/langgraph.py b/src/band/adapters/langgraph.py index a8906259f..8bc60fc09 100644 --- a/src/band/adapters/langgraph.py +++ b/src/band/adapters/langgraph.py @@ -192,6 +192,10 @@ def __init__( create_agent, ) + from band.integrations.langgraph.decline import ( # noqa: PLC0415 -- middleware is only used by the langchain-owned simple pattern + DeclineMiddleware, + ) + if checkpointer is None: checkpointer = InMemorySaver() @@ -200,6 +204,7 @@ def factory(turn_tools: list[Any]) -> Pregel: model=llm, tools=turn_tools, checkpointer=checkpointer, + middleware=[DeclineMiddleware()], ) graph_factory = factory diff --git a/src/band/adapters/pydantic_ai.py b/src/band/adapters/pydantic_ai.py index 44ad1ed72..732a4dcdb 100644 --- a/src/band/adapters/pydantic_ai.py +++ b/src/band/adapters/pydantic_ai.py @@ -46,11 +46,7 @@ from pydantic_ai.models import ( Model, ModelRequestContext, - create_async_http_client, - infer_model, ) -from pydantic_ai.providers import Provider, infer_provider -from pydantic_ai.providers.openai import OpenAIProvider from pydantic_ai.result import FinalResult from pydantic_graph import End from typing_extensions import Unpack @@ -329,29 +325,6 @@ def _takes_run_context(fn: Callable[..., Any]) -> bool: return annotation is RunContext or get_origin(annotation) is RunContext -_OPENAI_LEGACY_HTTP_PROVIDERS = frozenset({"openai", "openai-chat"}) - - -def _resolve_pydantic_ai_model(model: Model | str) -> Model | str: - """Resolve a model string, patching OpenAI providers to use legacy ``httpx``. - - pydantic-ai's OpenAI-compatible providers default to ``httpx2``, while the - ``openai`` Python SDK still type-checks for ``httpx.AsyncClient``. - """ - if not isinstance(model, str): - return model - provider_name = model.partition(":")[0] - if provider_name not in _OPENAI_LEGACY_HTTP_PROVIDERS: - return model - - def provider_factory(name: str) -> Provider[Any]: - if name in _OPENAI_LEGACY_HTTP_PROVIDERS: - return OpenAIProvider(http_client=create_async_http_client()) - return infer_provider(name) - - return infer_model(model, provider_factory) - - class PydanticAIAdapterConfig(BaseAdapterConfig): """Settings for a Pydantic AI agent. @@ -476,7 +449,7 @@ def _create_agent(self) -> Agent[AgentToolsProtocol, str | None]: self._system_prompt = system agent: Agent[AgentToolsProtocol, str | None] = Agent( - _resolve_pydantic_ai_model(self._model), + self._model, # Pass the rendered prompt as `instructions`, not `system_prompt`. # pydantic-ai materializes `system_prompt` as a single SystemPromptPart # only on the first request, after which it ages into buried history; @@ -609,6 +582,11 @@ async def on_message( # pydantic-ai's result.usage is already summed across the run's model # calls, so it's set once (on the result event), not accumulated. turn_usage = TurnUsage() + tool_call_count = 0 + tool_result_count = 0 + failed_tool_result_count = 0 + native_output_type: str | None = None + native_output_chars = 0 # Snapshot the prior messages' identities so the fallback usage path # (any run that raises) can sum only THIS run's responses: capture_run_messages() # records the passed message_history + the new turn, so summing the whole @@ -653,6 +631,7 @@ async def on_message( events=event_count, tool=event.part.tool_name, ) + tool_call_count += 1 if Emit.TOOL_CALLS in self.features.emit: try: await tools.send_event( @@ -679,6 +658,15 @@ async def on_message( events=event_count, tool=event.part.tool_name, ) + tool_result_count += 1 + if isinstance(event.part, RetryPromptPart) or ( + isinstance(event.part, ToolReturnPart) + and ( + event.part.outcome != "success" + or is_failed_tool_output(event.part.content) + ) + ): + failed_tool_result_count += 1 # Native custom tools run outside execute_custom_tool, so # their declared effect is recorded here. if ( @@ -720,6 +708,9 @@ async def on_message( ) elif isinstance(event, AgentRunResultEvent): _log_native_progress("result_received", events=event_count) + native_output_type = type(event.result.output).__name__ + if isinstance(event.result.output, str): + native_output_chars = len(event.result.output) turn_usage = self._usage_from_result(event.result) # Keep native run history, but drop responses that replay as # content:null (e.g. thinking-only) — providers reject them @@ -791,6 +782,19 @@ async def on_message( raise finally: _native_turn.reset(trace_token) + if native_output_type is not None and not tools.turn.complete: + logger.warning( + "Room %s message %s: native run ended without a turn outcome " + "(output_type=%s, output_chars=%s, tool_calls=%s, " + "tool_results=%s, failed_tool_results=%s)", + room_id, + msg.id, + native_output_type, + native_output_chars, + tool_call_count, + tool_result_count, + failed_tool_result_count, + ) capture_cm.__exit__(None, None, None) # Single emit point for every exit. A run that raised (benign # empty-final or a hard failure) never saw the result event, so diff --git a/src/band/integrations/langgraph/decline.py b/src/band/integrations/langgraph/decline.py new file mode 100644 index 000000000..e2de86920 --- /dev/null +++ b/src/band/integrations/langgraph/decline.py @@ -0,0 +1,51 @@ +"""Finish a native agent loop after a successful explicit decline.""" + +from __future__ import annotations + +import json +from collections.abc import Sequence +from typing import Any + +from langchain.agents.middleware import AgentMiddleware, AgentState, hook_config +from langchain_core.messages import AIMessage, BaseMessage, ToolMessage +from langgraph.runtime import Runtime + +from band.runtime.tools import BandTool +from band.runtime.tools.schema import is_failed_tool_output + + +def failed_result(message: ToolMessage) -> bool: + content = message.content + if isinstance(content, str): + try: + content = json.loads(content) + except ValueError: + pass + return message.status != "success" or is_failed_tool_output(content) + + +def terminal_decline(messages: Sequence[BaseMessage]) -> bool: + batch: list[ToolMessage] = [] + for message in reversed(messages): + if isinstance(message, ToolMessage): + batch.append(message) + continue + if not isinstance(message, AIMessage) or not batch: + return False + expected = {call["id"] for call in message.tool_calls} + if {result.tool_call_id for result in batch} != expected: + return False + return not any(failed_result(result) for result in batch) and any( + result.name == BandTool.NO_REPLY for result in batch + ) + return False + + +class DeclineMiddleware(AgentMiddleware): + @hook_config(can_jump_to=["end"]) + def before_model( + self, state: AgentState, runtime: Runtime[Any] + ) -> dict[str, Any] | None: + if terminal_decline(state["messages"]): + return {"jump_to": "end"} + return None diff --git a/tests/adapters/langgraph/test_message_input.py b/tests/adapters/langgraph/test_message_input.py index e937e72d3..4febea4d2 100644 --- a/tests/adapters/langgraph/test_message_input.py +++ b/tests/adapters/langgraph/test_message_input.py @@ -2,7 +2,7 @@ from datetime import UTC, datetime from typing import Any -from unittest.mock import MagicMock, patch +from unittest.mock import ANY, MagicMock, patch import pytest from langchain_core.messages import AIMessage, HumanMessage, SystemMessage @@ -12,8 +12,7 @@ from band.adapters.langgraph import LangGraphAdapter, LangGraphAdapterConfig from band.core.types import Capability, Emit, PlatformMessage - -from .helpers import make_capture_graph +from tests.adapters.langgraph.helpers import make_capture_graph class TestOnMessage: @@ -277,6 +276,7 @@ async def test_simple_factory_passes_platform_and_additional_tools( model=mock_llm, tools=[platform_tool, additional_tool], checkpointer=mock_checkpointer, + middleware=[ANY], ) @pytest.mark.asyncio diff --git a/tests/adapters/pydanticai/__init__.py b/tests/adapters/pydanticai/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/adapters/pydanticai/conftest.py b/tests/adapters/pydanticai/conftest.py new file mode 100644 index 000000000..b589c4891 --- /dev/null +++ b/tests/adapters/pydanticai/conftest.py @@ -0,0 +1,19 @@ +"""Shared Pydantic AI fixtures.""" + +from __future__ import annotations + +from tests.adapters.pydanticai.kit import ( + instrument_all_restored, + mock_pydantic_agent, + mock_tools, + sample_message, + trace_capture, +) + +__all__ = [ + "instrument_all_restored", + "mock_pydantic_agent", + "mock_tools", + "sample_message", + "trace_capture", +] diff --git a/tests/adapters/pydanticai/kit.py b/tests/adapters/pydanticai/kit.py new file mode 100644 index 000000000..cff7d66d5 --- /dev/null +++ b/tests/adapters/pydanticai/kit.py @@ -0,0 +1,442 @@ +"""Fixtures and provider doubles for Pydantic AI adapter tests.""" + +from __future__ import annotations + +import json +from collections.abc import AsyncIterator, Awaitable, Callable, Iterator +from contextlib import asynccontextmanager +from datetime import UTC, datetime +from types import SimpleNamespace +from typing import Any, NamedTuple +from unittest.mock import AsyncMock, MagicMock + +import pytest +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter +from pydantic_ai import ( + Agent, + AgentRunResultEvent, + FunctionToolCallEvent, + FunctionToolResultEvent, + InstrumentationSettings, +) +from pydantic_ai.messages import ( + ModelMessage, + ModelResponse, + RetryPromptPart, + TextPart, + ToolCallPart, + ToolReturnPart, +) +from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel +from pydantic_ai.models.test import TestModel + +from band.adapters.pydantic_ai import ( + PydanticAIAdapter, + PydanticAIAdapterConfig, + _custom_tool_def_to_callable, +) +from band.core.protocols import ( + AgentToolsProtocol, +) +from band.core.types import ( + MessageType, + PlatformMessage, + ToolEventKey, +) +from band.runtime.custom_tools import ( + CustomToolDef, +) +from band.runtime.tools import ( + BandTool, +) +from band.testing import ( + FakeAgentTools, + events_of_type, +) +from tests.adapters.usage_events import recorded_usage_payloads + + +def make_stream_events( + result_messages: list | None = None, + tool_calls: list[tuple[str, dict, str]] | None = None, + tool_results: list[tuple[str, str, str]] | None = None, +): + """Stand in for ``Agent.run_stream_events()``: an async CM over stream events. + + pydantic-ai 2.x makes ``run_stream_events()`` an async context manager that + yields the event iterator (it starts the run on first iteration and tears the + background task down on exit), so the fake has to be one too. + + Args: + result_messages: Messages to return in AgentRunResultEvent + tool_calls: List of (tool_name, args, tool_call_id) tuples + tool_results: List of (tool_name, output, tool_call_id) tuples + """ + + async def stream(): + # Emit tool call events + if tool_calls: + for tool_name, args, tool_call_id in tool_calls: + event = MagicMock(spec=FunctionToolCallEvent) + event.part = MagicMock() + event.part.tool_name = tool_name + event.part.args = args + event.part.args_as_dict = MagicMock(return_value=args) + event.part.tool_call_id = tool_call_id + yield event + + # Emit tool result events + if tool_results: + for tool_name, output, tool_call_id in tool_results: + event = MagicMock(spec=FunctionToolResultEvent) + event.part = MagicMock() + event.part.tool_name = tool_name # tool_name is on the part, not event + event.part.content = output + event.tool_call_id = tool_call_id + yield event + + # Always emit final result event + result_event = MagicMock(spec=AgentRunResultEvent) + result_event.result = MagicMock() + result_event.result.all_messages.return_value = result_messages or [] + yield result_event + + @asynccontextmanager + async def events() -> AsyncIterator[AsyncIterator]: + yield stream() + + return events() + + +def make_usage_response( + inp: int, out: int, parts: list[Any] | None = None +) -> ModelResponse: + """A ModelResponse carrying explicit usage counts. + + Real construction (fully initialized, so the dataclass stays repr-safe), + then the usage field is overridden past any frozen/validated assignment. + """ + response = ModelResponse(parts=parts or []) + object.__setattr__( + response, "usage", SimpleNamespace(input_tokens=inp, output_tokens=out) + ) + return response + + +@pytest.fixture +def sample_message(): + """Create a sample platform message.""" + return PlatformMessage( + id="msg-123", + room_id="room-123", + content="Hello, agent!", + sender_id="user-456", + sender_type="User", + sender_name="Alice", + message_type="text", + metadata={}, + created_at=datetime.now(UTC), + ) + + +@pytest.fixture +def mock_tools(): + """Create mock AgentToolsProtocol (MagicMock base, AsyncMock methods).""" + tools = MagicMock() + tools.send_message = AsyncMock(return_value={"status": "sent"}) + tools.send_event = AsyncMock(return_value={"status": "sent"}) + tools.send_failure = AsyncMock(return_value={"status": "sent"}) + tools.add_participant = AsyncMock(return_value={"id": "user-1"}) + tools.remove_participant = AsyncMock(return_value={"status": "removed"}) + tools.lookup_peers = AsyncMock(return_value={"peers": []}) + tools.get_participants = AsyncMock(return_value=[]) + tools.create_chatroom = AsyncMock(return_value="new-room-123") + return tools + + +@pytest.fixture +def mock_pydantic_agent(): + """Create a mock Pydantic AI Agent.""" + agent = MagicMock() + agent._function_tools = { + "band_send_message": MagicMock(name="band_send_message"), + "band_send_event": MagicMock(name="band_send_event"), + "band_add_participant": MagicMock(name="band_add_participant"), + "band_remove_participant": MagicMock(name="band_remove_participant"), + "band_lookup_peers": MagicMock(name="band_lookup_peers"), + "band_get_participants": MagicMock(name="band_get_participants"), + "band_create_chatroom": MagicMock(name="band_create_chatroom"), + } + return agent + + +class TraceCapture(NamedTuple): + """A tracer wired to memory, plus the settings that route an agent into it.""" + + provider: TracerProvider + settings: InstrumentationSettings + exporter: InMemorySpanExporter + + def operations(self) -> list[str]: + """The exported spans' operation names (``chat``, ``invoke_agent``, ...). + + The full span name carries the model and agent, which the assertions here + don't care about — the question is only whether the run was traced. + """ + return [span.name.split()[0] for span in self.exporter.get_finished_spans()] + + +@pytest.fixture +def trace_capture() -> Iterator[TraceCapture]: + """Host-owned tracer pipeline, exporting to memory instead of a collector.""" + exporter = InMemorySpanExporter() + provider = TracerProvider() + provider.add_span_processor(SimpleSpanProcessor(exporter)) + try: + yield TraceCapture( + provider=provider, + settings=InstrumentationSettings(tracer_provider=provider), + exporter=exporter, + ) + finally: + provider.shutdown() + + +@pytest.fixture +def instrument_all_restored() -> Iterator[None]: + """Undo ``Agent.instrument_all()``; it is process-wide state on the class.""" + previous = Agent._instrument_default + try: + yield + finally: + Agent.instrument_all(previous) + + +def message_types(mock_tools: MagicMock) -> list[str]: + """``message_type`` of every event posted through send_event, in order.""" + return [ + call.kwargs.get("message_type") for call in mock_tools.send_event.call_args_list + ] + + +def _reply(text: str) -> FunctionModel: + """A model that answers in plain text, so a run needs no network or tools.""" + + def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: + return ModelResponse(parts=[TextPart(content=text)]) + + return FunctionModel(respond) + + +def _wire_tool_call_args(args: Any) -> dict[str, Any] | str: + """Shape tool args the way providers send them on the wire (JSON text or object).""" + if isinstance(args, dict | str): + return args + return json.dumps(args) + + +def _scripted_tool_calls(*calls: tuple[str, Any]) -> FunctionModel: + """A model that makes ``calls``, one per turn, then answers in plain text. + + A rejected call brings the model straight back here with nothing left + pending, so it is attempted exactly once — which is what makes "never + dispatched" observable rather than merely slow. + """ + pending = list(calls) + + def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: + if pending: + name, args = pending.pop(0) + return ModelResponse(parts=[ToolCallPart(name, _wire_tool_call_args(args))]) + return ModelResponse(parts=[TextPart("done")]) + + return FunctionModel(respond) + + +async def _started_adapter(**features: Any) -> PydanticAIAdapter: + """A started adapter, i.e. one whose agent is really built.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test"), **features) + await adapter.on_started(agent_name="Probe", agent_description="probe") + return adapter + + +def _registered_names(adapter: PydanticAIAdapter) -> set[str]: + return set(adapter._agent._function_toolset.tools) + + +async def _call_tool( + adapter: PydanticAIAdapter, deps: Any, name: str, args: Any +) -> Any: + """Drive one built-in tool call through pydantic-ai's own execution path. + + Not the tool function directly: validation, argument splatting and the + retry conversion are pydantic-ai's, and calling the function by hand would + skip every one of them. + """ + with adapter._agent.override(model=_scripted_tool_calls((name, args))): + return await adapter._agent.run("go", deps=deps) + + +def _parts(result: Any, part_type: type) -> list[Any]: + return [ + part + for message in result.all_messages() + for part in message.parts + if isinstance(part, part_type) + ] + + +def _tool_returns(result: Any) -> list[Any]: + return [part.content for part in _parts(result, ToolReturnPart)] + + +def _streamed_tool_calls(*calls: tuple[str, dict[str, Any]]) -> FunctionModel: + """A streaming model (what ``on_message`` drives) making ``calls``, one per + request, then ending with nothing left to say.""" + pending = list(calls) + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: + if pending: + name, args = pending.pop(0) + yield {0: DeltaToolCall(name=name, json_args=json.dumps(args))} + else: + yield "" + + return FunctionModel(stream_function=stream) + + +class DecliningModel: + """A native streaming model that keeps declining if asked again.""" + + def __init__(self) -> None: + self.requests = 0 + self.model = FunctionModel(stream_function=self.stream) + + async def stream( + self, messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[dict[int, DeltaToolCall]]: + self.requests += 1 + yield { + 0: DeltaToolCall( + name=BandTool.NO_REPLY, + json_args=json.dumps({"reason": "Already answered"}), + tool_call_id=f"decline-{self.requests}", + ) + } + + +def _reply_arguments(message: PlatformMessage, content: str) -> dict[str, Any]: + return {"content": content, "mentions": [message.sender_name]} + + +def _tool_feedback(messages: list[ModelMessage]) -> str: + """Tool results and retry prompts a later model request can read.""" + return "\n".join( + str(part.content) + for message in messages + for part in message.parts + if isinstance(part, ToolReturnPart | RetryPromptPart) + ) + + +def _history_tool_returns(messages: list[ModelMessage]) -> list[tuple[str, str, Any]]: + return [ + (part.tool_name, part.tool_call_id, part.content) + for message in messages + for part in message.parts + if isinstance(part, ToolReturnPart) + ] + + +def _emitted_tool_results(tools: FakeAgentTools) -> list[tuple[str, str, str]]: + results = [ + json.loads(event["content"]) + for event in events_of_type(tools, MessageType.TOOL_RESULT) + ] + return [ + ( + result[ToolEventKey.NAME], + result[ToolEventKey.OUTPUT], + result[ToolEventKey.TOOL_CALL_ID], + ) + for result in results + ] + + +def _assert_billed_responses( + tools: FakeAgentTools, messages: list[ModelMessage], *, model_requests: int = 1 +) -> None: + responses = [message for message in messages if isinstance(message, ModelResponse)] + assert len(responses) == model_requests + (payload,) = recorded_usage_payloads(tools) + assert ( + payload["input_tokens"] + == sum(response.usage.input_tokens for response in responses) + > 0 + ) + assert ( + payload["output_tokens"] + == sum(response.usage.output_tokens for response in responses) + > 0 + ) + + +async def _run_on_message( + adapter: PydanticAIAdapter, msg: PlatformMessage, tools: FakeAgentTools +) -> None: + await adapter.on_message( + msg=msg, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id=tools.room_id, + ) + + +def make_raising_stream( + error: BaseException, + *, + work: Callable[[], Awaitable[object]] | None = None, +): + """Run stream (async CM, as 2.x returns) that does ``work``, then raises. + + ``work`` stands in for the tool calls the run made through the room's + tools, so the turn's ledger sees exactly what those calls did. + """ + + async def stream(): + if work is not None: + await work() + raise error + yield # an async generator, like the real event stream + + @asynccontextmanager + async def events() -> AsyncIterator[AsyncIterator]: + yield stream() + + return events() + + +def _portable_tool_agent( + tool_def: CustomToolDef, +) -> Agent[AgentToolsProtocol, str]: + """A bare agent running one converted ``CustomToolDef`` on pydantic-ai's own path.""" + agent = Agent(TestModel(), deps_type=AgentToolsProtocol, output_type=str) + agent.tool(_custom_tool_def_to_callable(tool_def)) + return agent + + +async def _run_portable_tool( + tool_def: CustomToolDef, tools: FakeAgentTools | None = None +) -> list[Any]: + """Run one converted ``CustomToolDef`` in a room; return what the model saw.""" + result = await _portable_tool_agent(tool_def).run( + "go", deps=tools or FakeAgentTools() + ) + return _tool_returns(result) diff --git a/tests/adapters/pydanticai/providerpeer.py b/tests/adapters/pydanticai/providerpeer.py new file mode 100644 index 000000000..bf8b5f866 --- /dev/null +++ b/tests/adapters/pydanticai/providerpeer.py @@ -0,0 +1,139 @@ +"""Local HTTP peer for the released default OpenAI provider.""" + +from __future__ import annotations + +import json +import threading +from collections.abc import Iterator +from contextlib import contextmanager +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from typing import Any + + +class ProviderPeer: + def __init__(self) -> None: + self.requests: list[dict[str, Any]] = [] + self.paths: list[str] = [] + + def response(self, path: str, request: dict[str, Any]) -> dict[str, Any]: + self.paths.append(path) + self.requests.append(request) + first = len(self.requests) == 1 + if path.endswith("/chat/completions"): + message = ( + { + "role": "assistant", + "content": None, + "tool_calls": [ + { + "id": "call-1", + "type": "function", + "function": { + "name": "record", + "arguments": '{"note":"hello"}', + }, + } + ], + } + if first + else {"role": "assistant", "content": "done"} + ) + return { + "id": "chat-1", + "object": "chat.completion", + "created": 1, + "model": request["model"], + "choices": [ + { + "index": 0, + "message": message, + "finish_reason": "tool_calls" if first else "stop", + } + ], + "usage": { + "prompt_tokens": 7, + "completion_tokens": 3, + "total_tokens": 10, + }, + } + output = ( + [ + { + "type": "function_call", + "id": "fc-1", + "call_id": "call-1", + "name": "record", + "arguments": '{"note":"hello"}', + "status": "completed", + } + ] + if first + else [ + { + "type": "message", + "id": "msg-1", + "role": "assistant", + "status": "completed", + "content": [ + {"type": "output_text", "text": "done", "annotations": []} + ], + } + ] + ) + return { + "id": "resp-1", + "object": "response", + "created_at": 1, + "status": "completed", + "model": request["model"], + "output": output, + "usage": { + "input_tokens": 7, + "output_tokens": 3, + "total_tokens": 10, + "input_tokens_details": {"cached_tokens": 0}, + "output_tokens_details": {"reasoning_tokens": 0}, + }, + } + + def tool_results(self) -> list[str]: + request = self.requests[1] + if "input" in request: + return [ + item["output"] + for item in request["input"] + if item.get("type") == "function_call_output" + ] + return [ + item["content"] + for item in request["messages"] + if item.get("role") == "tool" + ] + + @contextmanager + def serve(self) -> Iterator[str]: + peer = self + + class Handler(BaseHTTPRequestHandler): + def do_POST(self) -> None: + request = json.loads( + self.rfile.read(int(self.headers["Content-Length"])) + ) + data = json.dumps(peer.response(self.path, request)).encode() + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.send_header("Content-Length", str(len(data))) + self.end_headers() + self.wfile.write(data) + + def log_message(self, format: str, *args: Any) -> None: + pass + + with ThreadingHTTPServer(("127.0.0.1", 0), Handler) as server: + thread = threading.Thread(target=server.serve_forever, daemon=True) + thread.start() + try: + yield f"http://127.0.0.1:{server.server_port}/v1" + finally: + server.shutdown() + thread.join() diff --git a/tests/adapters/pydanticai/test_advertisedtoolschemas.py b/tests/adapters/pydanticai/test_advertisedtoolschemas.py new file mode 100644 index 000000000..f66eaa7f0 --- /dev/null +++ b/tests/adapters/pydanticai/test_advertisedtoolschemas.py @@ -0,0 +1,73 @@ +"""AdvertisedToolSchemas behavior for Pydantic AI.""" + +from __future__ import annotations + +import json + +import pytest + +from band.core.tool_filter import sanitize_tool_schema +from band.core.types import Capability +from band.runtime.tools import ( + TASK_TOOL_NAMES, + BandTool, + get_tool_description, + platform_args_schema, +) +from tests.adapters.pydanticai.kit import _started_adapter +from tests.framework_configs.adapters import pydantic_ai_probe_tools + + +class TestAdvertisedToolSchemas: + """Per-argument text fidelity is asserted in test_tool_text_drift. + + What is pydantic-ai-specific, and checked here, is that the master model's + own description and provider-safe JSON schema reach the framework — nothing + is re-derived from a hand-written function signature any more. + """ + + @pytest.mark.asyncio + async def test_tool_blurb_is_the_master_docstring(self): + blurbs = { + name: schema.description + for name, schema in (await pydantic_ai_probe_tools()).items() + } + + assert blurbs, "no tools registered, so nothing was actually checked" + assert blurbs == {name: get_tool_description(name).strip() for name in blurbs} + + @pytest.mark.asyncio + async def test_advertised_schema_is_the_master_schema(self): + schemas = { + name: schema.json_schema + for name, schema in (await pydantic_ai_probe_tools()).items() + } + + assert schemas, "no tools registered, so nothing was actually checked" + assert schemas == { + name: sanitize_tool_schema( + platform_args_schema(name).model_json_schema(), + drop_numeric_bounds=True, + ) + for name in schemas + } + + @pytest.mark.asyncio + async def test_task_schemas_avoid_single_value_const(self): + """Task tools are the ones with a single-value ``Literal``. + + Pydantic renders that as ``const``, which some providers' restricted + JSON-Schema subsets reject; ``platform_args_schema`` normalizes it to a + one-member ``enum``, and this is the proof the sanitized schema — not a + raw ``model_json_schema()`` — is what gets advertised. + """ + adapter = await _started_adapter(capabilities=Capability.TASKS) + tools = adapter._agent._function_toolset.tools + + for name in TASK_TOOL_NAMES: + assert "const" not in json.dumps(tools[name].function_schema.json_schema) + + include = tools[BandTool.GET_TASK].function_schema.json_schema["properties"][ + "include" + ] + assert {"enum": ["history"], "type": "string"} in include["anyOf"] diff --git a/tests/adapters/pydanticai/test_builtintoolexecution.py b/tests/adapters/pydanticai/test_builtintoolexecution.py new file mode 100644 index 000000000..49eb4bc87 --- /dev/null +++ b/tests/adapters/pydanticai/test_builtintoolexecution.py @@ -0,0 +1,180 @@ +"""BuiltinToolExecution behavior for Pydantic AI.""" + +from __future__ import annotations + +from unittest.mock import AsyncMock, MagicMock + +import pytest +from pydantic_ai.messages import RetryPromptPart + +from band.core.types import Capability +from band.runtime.tools import BandTool +from tests.adapters.pydanticai.kit import _call_tool, _parts, _started_adapter + + +class TestBuiltinToolExecution: + """Argument handling through pydantic-ai's real tool-calling loop. + + The integration supplies pydantic-ai with the master schema and a validator + that preserves its normalized kwargs and retry behavior. + """ + + @pytest.mark.asyncio + async def test_invalid_arguments_retry_without_dispatching(self): + deps = MagicMock() + deps.send_message = AsyncMock(return_value={"status": "sent"}) + adapter = await _started_adapter() + + result = await _call_tool( + adapter, + deps, + BandTool.SEND_MESSAGE, + {"content": "hi", "mentions": "alice"}, + ) + + (retry,) = _parts(result, RetryPromptPart) + assert "Invalid arguments for band_send_message" in str(retry.content) + assert "mentions" in str(retry.content) + deps.send_message.assert_not_called() + + @pytest.mark.asyncio + async def test_unknown_arguments_retry_without_dispatching(self): + """The schema-driven tool boundary keeps native tools' extra rejection.""" + deps = MagicMock() + deps.send_message = AsyncMock(return_value={"status": "sent"}) + adapter = await _started_adapter() + + result = await _call_tool( + adapter, + deps, + BandTool.SEND_MESSAGE, + {"content": "hi", "mentions": [], "unexpected": "value"}, + ) + + (retry,) = _parts(result, RetryPromptPart) + assert "unexpected" in str(retry.content) + deps.send_message.assert_not_called() + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "arguments", [["hi"], '"hi"', 123], ids=["list", "string", "number"] + ) + async def test_non_object_arguments_retry_without_dispatching(self, arguments): + """Valid JSON with a non-object shape is a model retry, not a crash.""" + deps = MagicMock() + deps.send_message = AsyncMock(return_value={"status": "sent"}) + adapter = await _started_adapter() + + result = await _call_tool( + adapter, + deps, + BandTool.SEND_MESSAGE, + arguments, + ) + + (_retry,) = _parts(result, RetryPromptPart) + deps.send_message.assert_not_called() + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("tool", "method_name", "expected_kwargs"), + [ + ( + BandTool.ADD_PARTICIPANT, + "add_participant", + {"identifier": "alice", "role": "member"}, + ), + ( + BandTool.REMOVE_PARTICIPANT, + "remove_participant", + {"identifier": "alice"}, + ), + ], + ids=["add_participant", "remove_participant"], + ) + async def test_validation_alias_argument_is_not_rejected_as_unknown( + self, tool, method_name, expected_kwargs + ): + """A field's ``validation_alias`` secondary name is a real accepted + argument, not an unrecognized one, even though it's absent from the + model's advertised JSON schema (which only lists the primary alias).""" + deps = MagicMock() + method = AsyncMock(return_value={"id": "user-1"}) + setattr(deps, method_name, method) + adapter = await _started_adapter() + + await _call_tool(adapter, deps, tool, {"name": "alice"}) + + method.assert_called_once_with(**expected_kwargs) + + @pytest.mark.asyncio + async def test_coercible_arguments_reach_the_dependency_normalized(self): + deps = MagicMock() + deps.list_tasks = AsyncMock(return_value={"tasks": []}) + adapter = await _started_adapter(capabilities=Capability.TASKS) + + await _call_tool(adapter, deps, BandTool.LIST_TASKS, {"limit": "5"}) + + # limit coerced to int; the two omitted optionals are not passed at all + # rather than handed over as None. + deps.list_tasks.assert_called_once_with(limit=5) + + @pytest.mark.asyncio + async def test_explicit_nulls_are_dropped_before_dispatch(self): + deps = MagicMock() + deps.send_event = AsyncMock(return_value={"status": "sent"}) + adapter = await _started_adapter() + + await _call_tool( + adapter, + deps, + BandTool.SEND_EVENT, + {"content": "thinking", "message_type": "thought", "metadata": None}, + ) + + deps.send_event.assert_called_once_with( + content="thinking", message_type="thought" + ) + + @pytest.mark.asyncio + async def test_dependency_is_called_with_master_field_names(self): + """The master model's field names are the dependency's keyword names. + + Keyword dispatch is what removes a whole class of bug the hand-written + wrappers had: ``send_room_file`` takes (content, filename, caption, + mentions) while the model lists them in another order. + """ + deps = MagicMock() + deps.send_room_file = AsyncMock(return_value={"message_id": "msg-1"}) + adapter = await _started_adapter(capabilities=Capability.FILES) + + await _call_tool( + adapter, + deps, + BandTool.SEND_ROOM_FILE, + { + "content": "file body", + "filename": "notes.txt", + "caption": "here's a file", + "mentions": ["Alice", "Bob"], + }, + ) + + deps.send_room_file.assert_called_once_with( + content="file body", + filename="notes.txt", + caption="here's a file", + mentions=["Alice", "Bob"], + ) + + @pytest.mark.asyncio + async def test_missing_backend_method_raises_an_actionable_error(self): + """A stale/typo'd registry method name is a registry bug -- it should + surface with the tool and method name, not a bare AttributeError.""" + deps = MagicMock(spec=[]) + adapter = await _started_adapter() + + with pytest.raises(RuntimeError, match="send_message"): + await _call_tool( + adapter, deps, BandTool.SEND_MESSAGE, {"content": "hi", "mentions": []} + ) diff --git a/tests/adapters/pydanticai/test_builtintoolregistration.py b/tests/adapters/pydanticai/test_builtintoolregistration.py new file mode 100644 index 000000000..bc39b72b7 --- /dev/null +++ b/tests/adapters/pydanticai/test_builtintoolregistration.py @@ -0,0 +1,79 @@ +"""BuiltinToolRegistration behavior for Pydantic AI.""" + +from __future__ import annotations + +import pytest + +from band.core.types import ALL_CAPABILITIES, Capability +from band.runtime.tools import ( + ALL_TOOL_NAMES, + CHAT_TOOL_NAMES, + CONTACT_TOOL_NAMES, + FILE_TOOL_NAMES, + MEMORY_TOOL_NAMES, + TASK_TOOL_NAMES, + BandTool, + ToolCategory, +) +from tests.adapters.pydanticai.kit import _registered_names, _started_adapter + + +class TestBuiltinToolRegistration: + """Exactly which built-in tools a set of features puts on the agent. + + Expectations are the registry's own name sets, so a newly added tool is + covered by whichever bucket it was declared in rather than by a literal + list someone has to remember to extend. + """ + + @pytest.mark.asyncio + async def test_default_features_register_only_chat_tools(self): + adapter = await _started_adapter() + + assert _registered_names(adapter) == CHAT_TOOL_NAMES + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("capabilities", "expected"), + [ + (Capability.CONTACTS, CHAT_TOOL_NAMES | CONTACT_TOOL_NAMES), + (Capability.MEMORY, CHAT_TOOL_NAMES | MEMORY_TOOL_NAMES), + (Capability.FILES, CHAT_TOOL_NAMES | FILE_TOOL_NAMES), + (Capability.TASKS, CHAT_TOOL_NAMES | TASK_TOOL_NAMES), + (ALL_CAPABILITIES, ALL_TOOL_NAMES), + ], + ids=["contacts", "memory", "files", "tasks", "all"], + ) + async def test_capability_selects_exact_tool_set(self, capabilities, expected): + adapter = await _started_adapter(capabilities=capabilities) + + assert _registered_names(adapter) == expected + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("feature_filter", "expected"), + [ + ({"include_tools": [BandTool.SEND_MESSAGE]}, {BandTool.SEND_MESSAGE}), + ( + {"exclude_tools": [BandTool.SEND_EVENT]}, + ALL_TOOL_NAMES - {BandTool.SEND_EVENT}, + ), + ({"include_categories": [ToolCategory.TASKS]}, TASK_TOOL_NAMES), + ], + ids=["include_tools", "exclude_tools", "include_categories"], + ) + async def test_feature_filters_narrow_the_capability_set( + self, feature_filter, expected + ): + adapter = await _started_adapter( + capabilities=ALL_CAPABILITIES, **feature_filter + ) + + assert _registered_names(adapter) == expected + + @pytest.mark.asyncio + async def test_filters_cannot_reintroduce_a_gated_tool(self): + """A filter narrows what the capabilities allow; it never widens it.""" + adapter = await _started_adapter(include_tools=[BandTool.STORE_MEMORY]) + + assert _registered_names(adapter) == set() diff --git a/tests/adapters/pydanticai/test_builtintoolresults.py b/tests/adapters/pydanticai/test_builtintoolresults.py new file mode 100644 index 000000000..21c8d0e25 --- /dev/null +++ b/tests/adapters/pydanticai/test_builtintoolresults.py @@ -0,0 +1,237 @@ +"""BuiltinToolResults behavior for Pydantic AI.""" + +from __future__ import annotations + +import json +from collections.abc import AsyncIterator +from unittest.mock import AsyncMock, MagicMock + +import pytest +from pydantic import BaseModel +from pydantic_ai.messages import BinaryContent, ModelMessage +from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.core.types import Capability, MessageType, ToolEventKey +from band.runtime.tools import BandTool, band_tool_errored +from band.testing import FakeAgentTools, events_of_type +from tests.adapters.pydanticai.kit import ( + _call_tool, + _started_adapter, + _streamed_tool_calls, + _tool_returns, +) +from tests.framework_conformance.turnprobes import ROOM_ID, turn_input +from tests.testing.support import seeded_peer + + +class TestBuiltinToolResults: + """What a finished built-in tool call hands back to the model.""" + + @pytest.mark.asyncio + async def test_add_participant_result_event_reads_as_plain_data(self): + """The tool_result event renders the result with str(), so a status + must read as its value, not as an enum member's repr.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test")) + await adapter.on_started("Probe", "probe") + adapter._agent.model = _streamed_tool_calls( + (BandTool.ADD_PARTICIPANT, {"identifier": "bob"}) + ) + tools = FakeAgentTools( + room_id=ROOM_ID, peers=[seeded_peer("bob-id", handle="bob", name="Bob")] + ) + + await adapter.on_event(turn_input(tools)) + + [event] = events_of_type(tools, MessageType.TOOL_RESULT) + output = json.loads(event["content"])[ToolEventKey.OUTPUT] + assert "'status': 'added'" in output + + @pytest.mark.asyncio + async def test_pydantic_results_are_serialized(self): + class Peer(BaseModel): + id: str + handle: str + + deps = MagicMock() + deps.lookup_peers = AsyncMock(return_value=Peer(id="p-1", handle="@ann")) + adapter = await _started_adapter() + + result = await _call_tool(adapter, deps, BandTool.LOOKUP_PEERS, {}) + + assert _tool_returns(result) == [{"id": "p-1", "handle": "@ann"}] + + @pytest.mark.asyncio + async def test_backend_failure_becomes_an_llm_readable_error(self): + deps = MagicMock() + deps.send_message = AsyncMock(side_effect=RuntimeError("backend down")) + adapter = await _started_adapter() + + result = await _call_tool( + adapter, deps, BandTool.SEND_MESSAGE, {"content": "hi", "mentions": []} + ) + + (content,) = _tool_returns(result) + assert "backend down" in content + # The wording is a contract with band_tool_errored, which the adapter + # reads to tell a failed Band tool from productive work. + assert band_tool_errored(BandTool.SEND_MESSAGE, content) + + @pytest.mark.asyncio + async def test_read_room_file_image_becomes_binary_content(self): + deps = MagicMock() + deps.read_room_file = AsyncMock( + return_value={ + "content": [ + {"type": "image", "data": "ZmFrZQ==", "mimeType": "image/png"} + ] + } + ) + adapter = await _started_adapter(capabilities=Capability.FILES) + + result = await _call_tool( + adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} + ) + + ((binary,),) = _tool_returns(result) + assert isinstance(binary, BinaryContent) + assert binary.data == b"fake" + assert binary.media_type == "image/png" + + @pytest.mark.asyncio + async def test_malformed_image_block_becomes_an_llm_readable_error(self): + """A block that fails to decode is a tool error, not a crashed run.""" + deps = MagicMock() + deps.read_room_file = AsyncMock( + return_value={ + "content": [ + { + "type": "image", + "data": "not-valid-base64!!", + "mimeType": "image/png", + } + ] + } + ) + adapter = await _started_adapter(capabilities=Capability.FILES) + + result = await _call_tool( + adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} + ) + + (content,) = _tool_returns(result) + assert band_tool_errored(BandTool.READ_ROOM_FILE, content) + + @pytest.mark.asyncio + async def test_non_image_file_result_passes_through(self): + deps = MagicMock() + deps.read_room_file = AsyncMock( + return_value={"name": "report.txt", "text": "hello world"} + ) + adapter = await _started_adapter(capabilities=Capability.FILES) + + result = await _call_tool( + adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} + ) + + assert _tool_returns(result) == [{"name": "report.txt", "text": "hello world"}] + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "room_event_error", + [None, RuntimeError("room offline")], + ids=["room_notified", "room_event_also_fails"], + ) + async def test_contact_request_failure_reaches_the_room(self, room_event_error): + """A contact request the agent failed to answer is invisible in the room + otherwise — it looks exactly like one that never arrived. Reporting it + is best-effort, so a failed room event must not change the tool's own + error output.""" + deps = MagicMock() + deps.respond_contact_request = AsyncMock(side_effect=RuntimeError("nope")) + deps.send_event = AsyncMock(side_effect=room_event_error) + adapter = await _started_adapter(capabilities=Capability.CONTACTS) + + result = await _call_tool( + adapter, + deps, + BandTool.RESPOND_CONTACT_REQUEST, + {"action": "approve", "handle": "@ann"}, + ) + + (content,) = _tool_returns(result) + assert "nope" in content + deps.send_event.assert_called_once_with(content, MessageType.ERROR) + + @pytest.mark.asyncio + async def test_contact_request_success_does_not_report_a_normalization_failure( + self, + ): + """A response that succeeded must not be reported to the room as + failed just because shaping its result afterward blew up.""" + deps = MagicMock() + approved = MagicMock() + approved.model_dump.side_effect = TypeError("boom during serialization") + deps.respond_contact_request = AsyncMock(return_value=approved) + deps.send_event = AsyncMock(return_value={"status": "sent"}) + adapter = await _started_adapter(capabilities=Capability.CONTACTS) + + result = await _call_tool( + adapter, + deps, + BandTool.RESPOND_CONTACT_REQUEST, + {"action": "approve", "handle": "@ann"}, + ) + + deps.respond_contact_request.assert_called_once_with( + action="approve", handle="@ann" + ) + (content,) = _tool_returns(result) + assert "boom during serialization" in content + deps.send_event.assert_not_called() + + @pytest.mark.asyncio + async def test_send_message_normalization_failure_counts_as_completed_work( + self, sample_message + ): + """A posted message is terminal even when its response cannot serialize.""" + calls_pending = True + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: + nonlocal calls_pending + if calls_pending: + calls_pending = False + yield { + 0: DeltaToolCall( + name=BandTool.SEND_MESSAGE, + json_args=json.dumps({"content": "hi", "mentions": []}), + tool_call_id="call-1", + ) + } + else: + yield "done" + + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test"), emit=()) + await adapter.on_started("Probe", "probe") + adapter._agent.model = FunctionModel(stream_function=stream) + + deps = MagicMock() + result = MagicMock() + result.model_dump.side_effect = TypeError("boom during serialization") + deps.send_message = AsyncMock(return_value=result) + deps.send_event = AsyncMock() + + await adapter.on_message( + msg=sample_message, + tools=deps, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + deps.send_message.assert_called_once_with(content="hi", mentions=[]) + deps.send_event.assert_not_called() diff --git a/tests/adapters/pydanticai/test_customtools.py b/tests/adapters/pydanticai/test_customtools.py new file mode 100644 index 000000000..affd28e91 --- /dev/null +++ b/tests/adapters/pydanticai/test_customtools.py @@ -0,0 +1,210 @@ +"""CustomTools behavior for Pydantic AI.""" + +from __future__ import annotations + +import contextlib +from typing import Any +from unittest.mock import MagicMock, patch + +import pytest +from pydantic_ai import RunContext +from pydantic_ai.messages import ModelRequest, UserPromptPart + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.core.protocols import AgentToolsProtocol, TurnResultAlreadyReported +from band.runtime.custom_tools import declares_turn_effect +from band.runtime.tools import TurnEffect +from band.testing import MISSING_REPLY_FAILURE, FakeAgentTools, failure_reports +from tests.adapters.pydanticai.kit import _streamed_tool_calls, make_stream_events +from tests.framework_conformance.turnprobes import ROOM_ID, turn_input + + +class TestCustomTools: + """Tests for custom tool support (PydanticAI-native functions).""" + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("declared", "reported"), [(True, []), (False, [MISSING_REPLY_FAILURE])] + ) + async def test_native_tool_counts_only_the_effect_it_declared( + self, declared: bool, reported: list + ): + """A native tool runs outside the portable custom-tool path, so its + declared effect still has to reach the turn; an undeclared one only + observes.""" + + async def finish(ctx: RunContext[AgentToolsProtocol], note: str) -> str: + """Finish the task.""" + return "done" + + if declared: + declares_turn_effect(TurnEffect.ACT)(finish) + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="test"), additional_tools=[finish] + ) + await adapter.on_started("Probe", "probe") + adapter._agent.model = _streamed_tool_calls(("finish", {"note": "go"})) + tools = FakeAgentTools(room_id=ROOM_ID) + + with contextlib.suppress(TurnResultAlreadyReported): + await adapter.on_event(turn_input(tools)) + + assert failure_reports(tools) == reported + + @pytest.mark.asyncio + async def test_a_native_tool_failure_value_leaves_the_turn_unanswered(self) -> None: + @declares_turn_effect(TurnEffect.ACT) + async def finish( + ctx: RunContext[AgentToolsProtocol], note: str + ) -> dict[str, Any]: + """Finish the task.""" + return {"ok": False, "error": "upstream refused"} + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="test"), additional_tools=[finish] + ) + await adapter.on_started("Probe", "probe") + adapter._agent.model = _streamed_tool_calls(("finish", {"note": "go"})) + tools = FakeAgentTools(room_id=ROOM_ID) + + with pytest.raises(TurnResultAlreadyReported): + await adapter.on_event(turn_input(tools)) + + assert failure_reports(tools) == [MISSING_REPLY_FAILURE] + + def test_accepts_additional_tools_parameter(self): + """Adapter accepts list of callables.""" + + async def my_tool(ctx: RunContext[AgentToolsProtocol], message: str) -> str: + """A custom tool.""" + return f"Echo: {message}" + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), additional_tools=[my_tool] + ) + + assert len(adapter._custom_tools) == 1 + assert adapter._custom_tools[0] == my_tool + + def test_multiple_custom_tools(self): + """Should accept multiple custom tools.""" + + async def tool_one(ctx: RunContext[AgentToolsProtocol], a: int) -> int: + """Tool one.""" + return a + 1 + + def tool_two(ctx: RunContext[AgentToolsProtocol], b: str) -> str: + """Tool two.""" + return b.upper() + + async def tool_three( + ctx: RunContext[AgentToolsProtocol], x: float, y: float + ) -> float: + """Tool three.""" + return x + y + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), + additional_tools=[tool_one, tool_two, tool_three], + ) + + assert len(adapter._custom_tools) == 3 + + @pytest.mark.asyncio + async def test_registers_custom_tools_with_agent(self): + """Custom tools should be registered via agent.tool().""" + + async def my_echo(ctx: RunContext[AgentToolsProtocol], message: str) -> str: + """Echo the message.""" + return f"Echo: {message}" + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="test"), additional_tools=[my_echo] + ) + + # Mock the Agent class to track tool registrations + registered_tools = [] + + with patch("band.adapters.pydantic_ai.Agent") as MockAgent: + mock_agent = MagicMock() + mock_agent.tool = MagicMock( + side_effect=lambda f: registered_tools.append(f) + ) + MockAgent.return_value = mock_agent + + await adapter.on_started("TestBot", "Test bot") + + # Should have registered platform tools + custom tool + tool_names = [t.__name__ for t in registered_tools] + assert "my_echo" in tool_names + + @pytest.mark.asyncio + async def test_custom_tool_appears_in_agent_function_tools( + self, mock_pydantic_agent + ): + """Custom tool should appear in agent._function_tools after registration.""" + + async def calculator( + ctx: RunContext[AgentToolsProtocol], a: float, b: float + ) -> float: + """Add two numbers.""" + return a + b + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), + additional_tools=[calculator], + ) + + # Add calculator to mock agent's function tools when tool() is called + def register_tool(func): + mock_pydantic_agent._function_tools[func.__name__] = MagicMock( + name=func.__name__ + ) + + mock_pydantic_agent.tool = MagicMock(side_effect=register_tool) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + # Manually call tool registration since we're mocking _create_agent + for custom_tool in adapter._custom_tools: + mock_pydantic_agent.tool(custom_tool) + + assert "calculator" in mock_pydantic_agent._function_tools + + @pytest.mark.asyncio + async def test_custom_tools_work_with_on_message( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Custom tools should work during message handling.""" + + async def my_helper(ctx: RunContext[AgentToolsProtocol], value: str) -> str: + """Helper tool.""" + return f"Helped: {value}" + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), + additional_tools=[my_helper], + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + result_messages = [ModelRequest(parts=[UserPromptPart(content="test")])] + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=result_messages, + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + # Should not raise + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + assert "room-123" in adapter._message_history diff --git a/tests/adapters/pydanticai/test_emptyfinalanswer.py b/tests/adapters/pydanticai/test_emptyfinalanswer.py new file mode 100644 index 000000000..94d0cdddf --- /dev/null +++ b/tests/adapters/pydanticai/test_emptyfinalanswer.py @@ -0,0 +1,327 @@ +"""EmptyFinalAnswer behavior for Pydantic AI.""" + +from __future__ import annotations + +import contextlib +import logging +from collections.abc import Awaitable, Callable +from contextlib import contextmanager +from pathlib import Path +from unittest.mock import MagicMock, patch + +import pytest +from pydantic_ai import UnexpectedModelBehavior, _tool_execution +from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart + +from band.adapters.pydantic_ai import ( + OUTPUT_RETRIES_EXHAUSTED, + PydanticAIAdapter, + PydanticAIAdapterConfig, + _is_output_retries_exhausted, +) +from band.core.exceptions import BandToolError +from band.core.protocols import GENERIC_PROVIDER_FAILURE_MESSAGE +from band.core.types import Emit, PlatformMessage +from band.testing import FakeAgentTools, failure_reports, reported_failures +from tests.adapters.pydanticai.kit import ( + _run_on_message, + make_raising_stream, + make_usage_response, +) +from tests.adapters.usage_events import sent_usage_payloads + + +class TestEmptyFinalAnswer: + """A model can end a turn with output pydantic-ai cannot accept — blank text, + say — after the agent already replied/acted via tools, exhausting the refused + output-retry budget. That is benign — the work already went out — so it must not + fail the message, but a genuine no-work failure must still surface. + """ + + def test_swallow_matches_the_wording_pydantic_ai_actually_raises(self) -> None: + """The swallow keys on message text, since pydantic-ai exposes no code for it. + + Every other test here builds the exception by hand, so a reword upstream + would leave them green while the swallow quietly stopped matching — which is + exactly what 2.x did to the 1.x phrasing ("Exceeded maximum retries (N) for + output validation"). Read the real source so a future reword fails here. + """ + + source = Path(_tool_execution.__file__).read_text(encoding="utf-8").lower() + assert OUTPUT_RETRIES_EXHAUSTED in source + assert _is_output_retries_exhausted( + UnexpectedModelBehavior("Exceeded maximum output retries (3)") + ) + assert not _is_output_retries_exhausted( + UnexpectedModelBehavior("Invalid response, unable to find output") + ) + + @pytest.mark.asyncio + async def test_empty_output_after_tool_is_benign( + self, + sample_message, + mock_pydantic_agent, + caplog: pytest.LogCaptureFixture, + ): + """Output-retry exhaustion after the turn replied is swallowed.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + tools = FakeAgentTools(room_id="room-123") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + UnexpectedModelBehavior("Exceeded maximum output retries (1)"), + work=lambda: tools.send_message("hi", ["@Alice"]), + ) + ) + caplog.set_level(logging.WARNING, logger="band.adapters.pydantic_ai") + + # Must not raise: the reply already went out via the tool this turn. + await adapter.on_message( + msg=sample_message, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Regression (fallback path): with the run mocked, capture_run_messages records + # nothing, so the swallow falls back to preserving at least the user prompt so + # the next same-session turn isn't amnesiac. + + preserved = adapter._message_history["room-123"] + assert preserved, "swallowed turn should still record the user message" + assert isinstance(preserved[-1], ModelRequest) + assert any( + isinstance(part, UserPromptPart) and "Hello, agent!" in str(part.content) + for part in preserved[-1].parts + ) + assert reported_failures(tools) == [] + assert "Exceeded maximum output retries (1)" in caplog.text + + @pytest.mark.asyncio + async def test_empty_output_preserves_full_captured_turn( + self, sample_message, mock_pydantic_agent + ): + """The swallow persists the whole captured turn — not just the user prompt — + so a later 'what did you just say?' has the agent's reply in context.""" + + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + tools = FakeAgentTools(room_id="room-xyz") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + UnexpectedModelBehavior("Exceeded maximum output retries (1)"), + work=lambda: tools.send_message("hi", ["@Alice"]), + ) + ) + + # pydantic-ai populates capture_run_messages during a real run; simulate a + # run that captured the full turn (user prompt + the agent's response). + full_turn = [ + ModelRequest(parts=[UserPromptPart(content="[Alice]: hi")]), + ModelResponse(parts=[TextPart(content="replied via tool")]), + ] + + @contextmanager + def fake_capture(): + yield full_turn + + with patch("band.adapters.pydantic_ai.capture_run_messages", fake_capture): + await adapter.on_message( + msg=sample_message, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-xyz", + ) + + preserved = adapter._message_history["room-xyz"] + # The full turn is kept — crucially the assistant response, not only the user. + assert preserved == full_turn + assert any(isinstance(message, ModelResponse) for message in preserved) + + @pytest.mark.asyncio + async def test_empty_output_without_tool_propagates( + self, sample_message, mock_pydantic_agent + ): + """Same error with no tool executed is a real failure — propagate.""" + await self._assert_exhaustion_propagates( + sample_message, mock_pydantic_agent, work=None + ) + + @pytest.mark.asyncio + async def test_failed_run_still_emits_captured_usage( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """A run that raises still emits the usage its captured responses accrued. + + Tokens spent before the failure were still spent: the finally-based emit + falls back to summing this run's captured ModelResponses when no result + event fired, so a hard mid-run failure doesn't silently drop usage.""" + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.USAGE + ) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + UnexpectedModelBehavior("Invalid response, unable to find output"), + ) + ) + + # Simulate a run that captured a response with usage before raising. + captured_turn = [ + ModelRequest(parts=[UserPromptPart(content="[Alice]: hi")]), + make_usage_response(100, 20, parts=[TextPart(content="partial")]), + ] + + @contextmanager + def fake_capture(): + yield captured_turn + + with ( + patch("band.adapters.pydantic_ai.capture_run_messages", fake_capture), + pytest.raises(UnexpectedModelBehavior), + ): + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + usage_payloads = sent_usage_payloads(mock_tools) + assert usage_payloads == [ + { + "input_tokens": 100, + "output_tokens": 20, + "cache_read_tokens": 0, + "cache_write_tokens": 0, + } + ], f"expected the captured run's usage to be emitted, got {usage_payloads}" + + @pytest.mark.asyncio + async def test_unrelated_model_error_propagates_even_after_tool( + self, sample_message, mock_pydantic_agent + ): + """The swallow is narrow: other model errors still surface after a reply.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + tools = FakeAgentTools(room_id="room-123") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + UnexpectedModelBehavior("Invalid response, unable to find output"), + work=lambda: tools.send_message("hi", ["@Alice"]), + ) + ) + + with pytest.raises(UnexpectedModelBehavior): + await _run_on_message(adapter, sample_message, tools) + + assert failure_reports(tools) == [ + ("pydantic_ai", GENERIC_PROVIDER_FAILURE_MESSAGE) + ] + + @pytest.mark.asyncio + async def test_generic_provider_error_reports_and_propagates( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """A failure that isn't UnexpectedModelBehavior at all (a raw provider/API + error) must still surface as a failure and propagate, not vanish uncaught.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + RuntimeError("provider connection reset"), + ) + ) + + with pytest.raises(RuntimeError, match="provider connection reset"): + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + mock_tools.send_failure.assert_awaited_once() + failure = mock_tools.send_failure.call_args.args[0] + assert failure.provider == "pydantic_ai" + assert failure.message == GENERIC_PROVIDER_FAILURE_MESSAGE + + @pytest.mark.asyncio + async def test_empty_output_after_read_only_tool_propagates( + self, sample_message, mock_pydantic_agent + ): + """A read-only lookup is not terminal work — output-validation exhaustion + after only a lookup is a genuine no-response failure and must propagate.""" + tools = FakeAgentTools(room_id="room-123") + + await self._assert_exhaustion_propagates( + sample_message, mock_pydantic_agent, tools=tools, work=tools.lookup_peers + ) + + @pytest.mark.asyncio + async def test_empty_output_after_failed_band_tool_propagates( + self, sample_message, mock_pydantic_agent + ): + """A band tool that raised did no work — exhausting output validation + afterward is a genuine failure and must propagate.""" + tools = FakeAgentTools(room_id="room-123") + + async def rejected_send() -> None: + # The band tool wrapper turns this raise into an error string for + # the model; the turn records nothing either way. + with contextlib.suppress(BandToolError): + await tools.send_message("hi", mentions=[]) + + await self._assert_exhaustion_propagates( + sample_message, mock_pydantic_agent, tools=tools, work=rejected_send + ) + + @staticmethod + async def _assert_exhaustion_propagates( + sample_message: PlatformMessage, + mock_pydantic_agent: MagicMock, + *, + work: Callable[[], Awaitable[object]] | None, + tools: FakeAgentTools | None = None, + ) -> None: + """Output-retry exhaustion after ``work`` fails the turn as a provider error.""" + tools = tools or FakeAgentTools(room_id="room-123") + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + adapter._agent.run_stream_events = MagicMock( + return_value=make_raising_stream( + UnexpectedModelBehavior("Exceeded maximum output retries (1)"), + work=work, + ) + ) + + with pytest.raises(UnexpectedModelBehavior): + await _run_on_message(adapter, sample_message, tools) + + assert failure_reports(tools) == [ + ("pydantic_ai", GENERIC_PROVIDER_FAILURE_MESSAGE) + ] diff --git a/tests/adapters/pydanticai/test_executionreporting.py b/tests/adapters/pydanticai/test_executionreporting.py new file mode 100644 index 000000000..d9c323963 --- /dev/null +++ b/tests/adapters/pydanticai/test_executionreporting.py @@ -0,0 +1,294 @@ +"""ExecutionReporting behavior for Pydantic AI.""" + +from __future__ import annotations + +from unittest.mock import AsyncMock, MagicMock, patch + +import httpx +import pytest +from pydantic_ai.messages import BinaryContent, ModelRequest, UserPromptPart + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.core.types import Emit +from tests.adapters.pydanticai.kit import make_stream_events, message_types + + +class TestExecutionReporting: + """Tests for execution reporting (tool_call and tool_result events).""" + + @pytest.mark.asyncio + async def test_emits_tool_call_events_when_enabled( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should emit tool_call events when emit=Emit.TOOL_CALLS.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], + tool_results=[("band_send_message", "Message sent", "call-123")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Verify send_event was called with tool_call + mock_tools.send_event.assert_any_call( + content='{"name": "band_send_message", "args": {"content": "Hello"}, "tool_call_id": "call-123"}', + message_type="tool_call", + ) + + @pytest.mark.asyncio + async def test_tool_call_event_redacts_send_room_file_content( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """band_send_room_file's content arg can carry up to + MAX_SEND_CONTENT_BYTES of real file bytes; the tool_call event must + report a bounded placeholder instead of the raw content.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_calls=[ + ( + "band_send_room_file", + {"content": "SECRET FILE BYTES", "filename": "f.txt"}, + "call-123", + ) + ], + tool_results=[("band_send_message", "Message sent", "call-2")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + reported_content = mock_tools.send_event.call_args_list[0].kwargs["content"] + assert "SECRET FILE BYTES" not in reported_content + assert "byte file content" in reported_content + assert '"filename": "f.txt"' in reported_content + + @pytest.mark.asyncio + async def test_emits_tool_result_events_when_enabled( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should emit tool_result events when emit=Emit.TOOL_CALLS.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_results=[ + ("band_send_message", "Message sent successfully", "call-123") + ], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Verify send_event was called with tool_result + mock_tools.send_event.assert_any_call( + content='{"name": "band_send_message", "output": "Message sent successfully", "tool_call_id": "call-123"}', + message_type="tool_result", + ) + + @pytest.mark.asyncio + async def test_tool_result_event_redacts_binary_content( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """band_read_room_file's image result is a list[BinaryContent]; str() + on that embeds the raw image bytes via BinaryContent.__repr__. The + tool_result event must report a bounded placeholder instead.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + image = BinaryContent( + data=b"\x89PNG\r\n\x1a\n" + b"\x00" * 64, media_type="image/png" + ) + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_results=[ + ("band_read_room_file", [image], "call-1"), + ("band_send_message", "Message sent", "call-2"), + ], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + mock_tools.send_event.assert_any_call( + content='{"name": "band_read_room_file", "output": "<1 image content block(s)>", "tool_call_id": "call-1"}', + message_type="tool_result", + ) + + @pytest.mark.asyncio + async def test_no_events_when_reporting_disabled( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """emit=() disables tool_call/tool_result events (emit otherwise defaults on).""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=() + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], + tool_results=[("band_send_message", "Message sent", "call-123")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Verify send_event was NOT called for tool_call or tool_result + assert not set(message_types(mock_tools)) & {"tool_call", "tool_result"} + + @pytest.mark.asyncio + async def test_multiple_tool_calls_all_reported( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should emit events for all tool calls in sequence.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_calls=[ + ("band_lookup_peers", {}, "call-1"), + ("band_add_participant", {"identifier": "Helper"}, "call-2"), + ("band_send_message", {"content": "Done"}, "call-3"), + ], + tool_results=[ + ("band_lookup_peers", "[{...}]", "call-1"), + ("band_add_participant", "Added", "call-2"), + ("band_send_message", "Sent", "call-3"), + ], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Count tool_call and tool_result events + types = message_types(mock_tools) + assert types.count("tool_call") == 3 + assert types.count("tool_result") == 3 + + @pytest.mark.asyncio + async def test_event_failure_does_not_crash_run( + self, sample_message, mock_pydantic_agent + ): + """Should continue running if send_event fails.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS + ) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + # Mock tools where send_event fails with a real transport error — the + # tool_call event's own local guard swallows this and logs a warning; + # a generic Exception would be a bug and is intentionally left to + # propagate. + failing_tools = AsyncMock() + failing_tools.send_event = AsyncMock( + side_effect=httpx.ConnectError("Network error") + ) + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[ModelRequest(parts=[UserPromptPart(content="test")])], + tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], + tool_results=[("band_send_message", "Message sent", "call-123")], + ) + ) + + # Should not raise + await adapter.on_message( + msg=sample_message, + tools=failing_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # History should still be updated + assert "room-123" in adapter._message_history diff --git a/tests/adapters/pydanticai/test_explicitdecline.py b/tests/adapters/pydanticai/test_explicitdecline.py new file mode 100644 index 000000000..703933544 --- /dev/null +++ b/tests/adapters/pydanticai/test_explicitdecline.py @@ -0,0 +1,358 @@ +"""ExplicitDecline behavior for Pydantic AI.""" + +from __future__ import annotations + +import asyncio +import json +from collections.abc import AsyncIterator +from typing import Any +from unittest.mock import AsyncMock + +import pytest +from pydantic_ai import AgentRunResultEvent +from pydantic_ai.messages import ModelMessage +from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel +from pydantic_ai.usage import UsageLimits + +from band.adapters.pydantic_ai import PydanticAIAdapter, _is_replayable_history_message +from band.core.types import Emit, PlatformMessage +from band.runtime.custom_tools import declares_turn_effect +from band.runtime.tools import BandTool, TurnEffect +from band.testing import FakeAgentTools, reported_failures +from tests.adapters.pydanticai.kit import ( + DecliningModel, + _assert_billed_responses, + _emitted_tool_results, + _history_tool_returns, + _reply_arguments, + _run_on_message, + _started_adapter, + _streamed_tool_calls, + _tool_feedback, + _tool_returns, +) + + +class TestExplicitDecline: + @pytest.mark.asyncio + @pytest.mark.parametrize("request_limit", [1, 3]) + async def test_decline_ends_native_stream_on_last_allowed_request( + self, request_limit: int + ) -> None: + model = DecliningModel() + adapter = PydanticAIAdapter(llm=model.model) + await adapter.on_started("Probe", "probe") + tools = FakeAgentTools() + results = [] + async with adapter._agent.run_stream_events( + "go", deps=tools, usage_limits=UsageLimits(request_limit=request_limit) + ) as events: + async for event in events: + if isinstance(event, AgentRunResultEvent): + results.append(event.result) + + assert model.requests == 1 + assert len(results) == 1 + assert results[0].output is None + assert _tool_returns(results[0]) == [{"status": "no_reply"}] + assert tools.turn.replied + assert reported_failures(tools) == [] + + @pytest.mark.asyncio + async def test_adapter_preserves_decline_events_history_and_per_turn_usage( + self, sample_message: PlatformMessage + ) -> None: + model = DecliningModel() + adapter = PydanticAIAdapter(llm=model.model, emit=(Emit.TOOL_CALLS, Emit.USAGE)) + await adapter.on_started("Probe", "probe") + tools = FakeAgentTools() + await _run_on_message(adapter, sample_message, tools) + + assert model.requests == 1 + assert _emitted_tool_results(tools) == [ + (BandTool.NO_REPLY, "{'status': 'no_reply'}", "decline-1") + ] + prior = list(adapter._message_history[tools.room_id]) + assert _history_tool_returns(prior) == [ + (BandTool.NO_REPLY, "decline-1", {"status": "no_reply"}) + ] + assert all(_is_replayable_history_message(message) for message in prior) + _assert_billed_responses(tools, prior) + assert reported_failures(tools) == [] + + seen_history: list[ModelMessage] = [] + + async def followup( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: + if not seen_history: + seen_history.extend(messages) + yield { + 0: DeltaToolCall( + name=BandTool.SEND_MESSAGE, + json_args=json.dumps( + _reply_arguments(sample_message, "A fresh reply") + ), + ) + } + else: + yield "done" + + next_tools = FakeAgentTools(room_id=tools.room_id) + with adapter._agent.override(model=FunctionModel(stream_function=followup)): + await adapter.on_message( + msg=sample_message, + tools=next_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=False, + room_id=tools.room_id, + ) + + assert _history_tool_returns(seen_history) == _history_tool_returns(prior) + assert next_tools.chat[0] == "A fresh reply" + new_history = adapter._message_history[tools.room_id][len(prior) :] + _assert_billed_responses(next_tools, new_history, model_requests=2) + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "rejection", + [RuntimeError("decline rejected"), {"ok": False}, None], + ids=["raised", "returned_failure", "invalid_arguments"], + ) + async def test_failed_decline_keeps_required_reply_executable( + self, sample_message: PlatformMessage, rejection: Any + ) -> None: + tools = FakeAgentTools() + if isinstance(rejection, Exception): + tools.no_reply = AsyncMock(side_effect=rejection) + elif rejection is not None: + tools.no_reply = AsyncMock(return_value=rejection) + decline_args = ( + {"unexpected": True} if rejection is None else {"reason": "decline"} + ) + adapter = await _started_adapter() + with adapter._agent.override( + model=_streamed_tool_calls( + (BandTool.NO_REPLY, decline_args), + ( + BandTool.SEND_MESSAGE, + _reply_arguments(sample_message, "Required reply"), + ), + ) + ): + await _run_on_message(adapter, sample_message, tools) + + assert tools.chat == ["Required reply"] + assert reported_failures(tools) == [] + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "first_tool", [BandTool.SEND_MESSAGE, BandTool.GET_PARTICIPANTS, "do_work"] + ) + async def test_other_successful_tools_do_not_end_the_loop( + self, sample_message: PlatformMessage, first_tool: str + ) -> None: + work_done = [] + + @declares_turn_effect(TurnEffect.ACT) + async def do_work() -> str: + work_done.append("worked") + return "worked" + + tools = FakeAgentTools() + adapter = await _started_adapter(additional_tools=[do_work]) + arguments = ( + _reply_arguments(sample_message, "First reply") + if first_tool == BandTool.SEND_MESSAGE + else {} + ) + with adapter._agent.override( + model=_streamed_tool_calls( + (first_tool, arguments), + ( + BandTool.SEND_MESSAGE, + _reply_arguments(sample_message, "Required next reply"), + ), + ) + ): + await _run_on_message(adapter, sample_message, tools) + + assert tools.chat[-1] == "Required next reply" + if first_tool == "do_work": + assert work_done == ["worked"] + assert reported_failures(tools) == [] + + @pytest.mark.asyncio + async def test_decline_preserves_every_result_in_its_tool_batch( + self, sample_message: PlatformMessage + ) -> None: + async def batch( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[dict[int, DeltaToolCall]]: + yield { + 0: DeltaToolCall( + name=BandTool.NO_REPLY, json_args="{}", tool_call_id="decline" + ), + 1: DeltaToolCall( + name=BandTool.SEND_MESSAGE, + json_args=json.dumps( + _reply_arguments(sample_message, "Already sent") + ), + tool_call_id="reply", + ), + 2: DeltaToolCall( + name=BandTool.GET_PARTICIPANTS, json_args="{}", tool_call_id="read" + ), + } + + adapter = PydanticAIAdapter( + llm=FunctionModel(stream_function=batch), emit=Emit.TOOL_CALLS + ) + await adapter.on_started("Probe", "probe") + tools = FakeAgentTools() + await _run_on_message(adapter, sample_message, tools) + + returns = _history_tool_returns(adapter._message_history[tools.room_id]) + assert {(name, call_id) for name, call_id, _ in returns} == { + (BandTool.NO_REPLY, "decline"), + (BandTool.SEND_MESSAGE, "reply"), + (BandTool.GET_PARTICIPANTS, "read"), + } + assert { + (name, call_id) for name, _, call_id in _emitted_tool_results(tools) + } == {(name, call_id) for name, call_id, _ in returns} + assert tools.chat == ["Already sent"] + assert reported_failures(tools) == [] + + @pytest.mark.asyncio + @pytest.mark.parametrize( + ("failure", "shown"), + [ + ("raised", "Error executing band_send_message: post failed"), + ("returned_failure", "{'ok': False}"), + ("invalid_arguments", "Invalid arguments for band_send_message"), + ], + ) + async def test_a_failed_sibling_keeps_the_decline_batch_open( + self, sample_message: PlatformMessage, failure: str, shown: str + ) -> None: + """A successful decline leaves the loop running when another tool in the same response failed.""" + tools = FakeAgentTools() + if failure != "invalid_arguments": + send_message = tools.send_message + + async def fail_named_post( + content: str, + mentions: list[str] | list[dict[str, str]] | None = None, + ) -> Any: + if content != "Will fail": + return await send_message(content, mentions) + if failure == "raised": + raise RuntimeError("post failed") + return {"ok": False} + + tools.send_message = fail_named_post + + requests = 0 + followup: list[ModelMessage] = [] + send_arguments: dict[str, Any] = ( + {"content": "Will fail", "mentions": "alice"} + if failure == "invalid_arguments" + else _reply_arguments(sample_message, "Will fail") + ) + + async def batch( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: + nonlocal requests + requests += 1 + if requests == 1: + yield { + 0: DeltaToolCall( + name=BandTool.NO_REPLY, + json_args=json.dumps({"reason": "Settled"}), + tool_call_id="decline", + ), + 1: DeltaToolCall( + name=BandTool.SEND_MESSAGE, + json_args=json.dumps(send_arguments), + tool_call_id="reply", + ), + } + return + if requests == 2: + followup.extend(messages) + yield { + 0: DeltaToolCall( + name=BandTool.SEND_MESSAGE, + json_args=json.dumps( + _reply_arguments(sample_message, "Recovered") + ), + tool_call_id="recovered", + ) + } + return + yield "" + + adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=batch)) + await adapter.on_started("Probe", "probe") + await _run_on_message(adapter, sample_message, tools) + + assert requests == 3 + assert shown in _tool_feedback(followup) + assert shown in _tool_feedback(adapter._message_history[tools.room_id]) + assert tools.chat == ["Recovered"] + assert reported_failures(tools) == [] + + @pytest.mark.asyncio + @pytest.mark.parametrize("cancel", [False, True], ids=["continue", "cancel"]) + async def test_concurrent_room_keeps_its_lifecycle( + self, sample_message: PlatformMessage, cancel: bool + ) -> None: + entered, release, cleaned = asyncio.Event(), asyncio.Event(), asyncio.Event() + + async def wait_for_work() -> str: + entered.set() + try: + await release.wait() + return "work completed" + finally: + cleaned.set() + + adapter = await _started_adapter(additional_tools=[wait_for_work]) + slow_tools, decline_tools = ( + FakeAgentTools(room_id="slow"), + FakeAgentTools(room_id="decline"), + ) + + async def slow_room() -> None: + with adapter._agent.override( + model=_streamed_tool_calls( + ("wait_for_work", {}), + ( + BandTool.SEND_MESSAGE, + _reply_arguments(sample_message, "Finished work"), + ), + ) + ): + await _run_on_message(adapter, sample_message, slow_tools) + + async with asyncio.TaskGroup() as group: + task = group.create_task(slow_room()) + try: + await entered.wait() + with adapter._agent.override(model=DecliningModel().model): + await _run_on_message(adapter, sample_message, decline_tools) + assert not task.done() + if cancel: + task.cancel() + finally: + release.set() + + assert cleaned.is_set() + assert task.cancelled() is cancel + assert slow_tools.chat == ([] if cancel else ["Finished work"]) + assert decline_tools.chat == [] + assert reported_failures(slow_tools) == reported_failures(decline_tools) == [] diff --git a/tests/adapters/pydanticai/test_historymanagement.py b/tests/adapters/pydanticai/test_historymanagement.py new file mode 100644 index 000000000..123922fef --- /dev/null +++ b/tests/adapters/pydanticai/test_historymanagement.py @@ -0,0 +1,216 @@ +"""HistoryManagement behavior for Pydantic AI.""" + +from __future__ import annotations + +from unittest.mock import MagicMock, patch + +import pytest +from pydantic_ai.messages import ( + ModelRequest, + ModelResponse, + NativeToolCallPart, + TextPart, + ThinkingPart, + ToolCallPart, + ToolReturnPart, + UserPromptPart, +) + +from band.adapters.pydantic_ai import ( + PydanticAIAdapter, + PydanticAIAdapterConfig, + _drop_non_replayable_messages, + _is_replayable_history_message, +) +from tests.adapters.pydanticai.kit import make_stream_events + + +class TestHistoryManagement: + """Tests for message history management.""" + + @pytest.mark.asyncio + async def test_updates_history_after_run( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should update stored history with all messages from run.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + new_messages = [ + ModelRequest(parts=[UserPromptPart(content="Q1")]), + ModelResponse(parts=[TextPart(content="A1")]), + ] + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=new_messages, + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + assert adapter._message_history["room-123"] == new_messages + + @pytest.mark.asyncio + async def test_keeps_native_history_and_drops_content_null_responses( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should keep native tool history but drop responses that replay as null.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + user_request = ModelRequest(parts=[UserPromptPart(content="Q1")]) + tool_call_response = ModelResponse( + parts=[ + ToolCallPart( + tool_name="band_send_message", + args={"content": "A1", "mentions": ["Alice"]}, + tool_call_id="call_1", + ) + ] + ) + tool_return_request = ModelRequest( + parts=[ + ToolReturnPart( + tool_name="band_send_message", + content={"id": "msg_1"}, + tool_call_id="call_1", + ) + ] + ) + content_null_response = ModelResponse(parts=[]) + text_response = ModelResponse(parts=[TextPart(content="A1")]) + result_messages = [ + user_request, + tool_call_response, + tool_return_request, + content_null_response, + text_response, + ] + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=result_messages, + tool_results=[("band_send_message", {"id": "msg_1"}, "call_1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + stored_history = adapter._message_history["room-123"] + assert stored_history == [ + user_request, + tool_call_response, + tool_return_request, + text_response, + ] + assert content_null_response not in stored_history + + def test_keeps_response_with_only_native_tool_part(self): + """Native tool calls carry content the provider expects — keep them.""" + response = ModelResponse( + parts=[ + NativeToolCallPart( + tool_name="web_search", + args={"query": "weather"}, + tool_call_id="call_1", + ) + ] + ) + + assert _is_replayable_history_message(response) is True + + def test_history_processor_strips_content_null_responses(self): + """The processor drops empty/thinking-only responses, keeps real content. + + This runs before every model request (mid-run included), so an empty or + thinking-only response the model emits within a turn is never replayed as + assistant content:null — which providers reject. + """ + user_request = ModelRequest(parts=[UserPromptPart(content="Q1")]) + tool_call = ModelResponse( + parts=[ + ToolCallPart( + tool_name="band_send_message", + args={"content": "hi", "mentions": ["Alice"]}, + tool_call_id="call_1", + ) + ] + ) + tool_return = ModelRequest( + parts=[ + ToolReturnPart( + tool_name="band_send_message", + content={"id": "msg_1"}, + tool_call_id="call_1", + ) + ] + ) + empty_response = ModelResponse(parts=[]) + thinking_only = ModelResponse(parts=[ThinkingPart(content="hmm")]) + text_response = ModelResponse(parts=[TextPart(content="done")]) + + processed = _drop_non_replayable_messages( + [ + user_request, + tool_call, + tool_return, + empty_response, + thinking_only, + text_response, + ] + ) + + assert processed == [user_request, tool_call, tool_return, text_response] + assert empty_response not in processed + assert thinking_only not in processed + + @pytest.mark.asyncio + async def test_ensures_history_exists_for_non_bootstrap( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should create history if not bootstrap and room doesn't exist.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=False, # Not bootstrap + room_id="new-room", + ) + + # Should have created empty history + assert "new-room" in adapter._message_history diff --git a/tests/adapters/pydanticai/test_instrumentation.py b/tests/adapters/pydanticai/test_instrumentation.py new file mode 100644 index 000000000..d6b39e361 --- /dev/null +++ b/tests/adapters/pydanticai/test_instrumentation.py @@ -0,0 +1,117 @@ +"""Instrumentation behavior for Pydantic AI.""" + +from __future__ import annotations + +import pytest +from pydantic_ai import Agent +from pydantic_ai.messages import ( + ModelMessage, + ModelRequest, + ModelResponse, + TextPart, + ThinkingPart, + UserPromptPart, +) +from pydantic_ai.models.function import AgentInfo, FunctionModel + +from band.adapters.pydantic_ai import PydanticAIAdapter +from tests.adapters.pydanticai.kit import TraceCapture, _reply + + +class TestInstrumentation: + """Tests for the ``instrument`` pass-through to pydantic-ai. + + Band creates no TracerProvider and no exporter: the host owns the pipeline and + hands the agent an ``InstrumentationSettings`` (or flips ``Agent.instrument_all``). + """ + + def test_settings_route_the_run_into_the_host_tracer( + self, trace_capture: TraceCapture, mock_tools + ): + """Explicit settings trace the model call and the agent run.""" + adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=trace_capture.settings) + adapter.agent_name = "TestBot" + + adapter._create_agent().run_sync("hello", deps=mock_tools) + + assert trace_capture.operations() == ["chat", "invoke_agent"] + + def test_true_traces_through_the_ambient_provider( + self, + trace_capture: TraceCapture, + monkeypatch: pytest.MonkeyPatch, + mock_tools, + ): + """``True`` is the shorthand for a host that published its providers. + + pydantic-ai resolves the ambient ``TracerProvider`` when it builds the + default settings, so this only traces in a process that set one — which + is why examples/opentelemetry hands over settings instead. + """ + monkeypatch.setattr( + "pydantic_ai.models.instrumented.get_tracer_provider", + lambda: trace_capture.provider, + ) + adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=True) + adapter.agent_name = "TestBot" + + adapter._create_agent().run_sync("hello", deps=mock_tools) + + assert trace_capture.operations() == ["chat", "invoke_agent"] + + def test_default_inherits_instrument_all( + self, trace_capture: TraceCapture, instrument_all_restored, mock_tools + ): + """Passing nothing leaves the host's process-wide choice in force.""" + Agent.instrument_all(trace_capture.settings) + adapter = PydanticAIAdapter(llm=_reply("ok")) + adapter.agent_name = "TestBot" + + adapter._create_agent().run_sync("hello", deps=mock_tools) + + assert trace_capture.operations() == ["chat", "invoke_agent"] + + def test_false_opts_out_of_instrument_all( + self, trace_capture: TraceCapture, instrument_all_restored, mock_tools + ): + """``False`` is not "unset": it excludes this agent from a traced process.""" + Agent.instrument_all(trace_capture.settings) + adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=False) + adapter.agent_name = "TestBot" + + adapter._create_agent().run_sync("hello", deps=mock_tools) + + assert trace_capture.operations() == [] + + def test_instrumented_agent_still_drops_content_null_history( + self, trace_capture: TraceCapture, mock_tools + ): + """Instrumentation must not cost the ProcessHistory capability. + + Both ride on the agent, and an implementation that passed instrumentation + as a capability would silently replace the history processor — sending + providers the thinking-only response as assistant ``content: null``. + """ + seen: list[list[ModelMessage]] = [] + + def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: + seen.append(list(messages)) + return ModelResponse(parts=[TextPart(content="ok")]) + + adapter = PydanticAIAdapter( + llm=FunctionModel(respond), instrument=trace_capture.settings + ) + adapter.agent_name = "TestBot" + + adapter._create_agent().run_sync( + "hello", + deps=mock_tools, + message_history=[ + ModelRequest(parts=[UserPromptPart(content="earlier")]), + ModelResponse(parts=[ThinkingPart(content="hmm")]), + ], + ) + + (sent_to_model,) = seen + assert not [m for m in sent_to_model if isinstance(m, ModelResponse)] + assert trace_capture.operations() == ["chat", "invoke_agent"] diff --git a/tests/adapters/pydanticai/test_nativediagnostics.py b/tests/adapters/pydanticai/test_nativediagnostics.py new file mode 100644 index 000000000..0aecaa876 --- /dev/null +++ b/tests/adapters/pydanticai/test_nativediagnostics.py @@ -0,0 +1,80 @@ +"""Unsettled native runs expose bounded metadata without their content.""" + +from __future__ import annotations + +import logging +from collections.abc import AsyncIterator + +import pytest +from pydantic_ai.messages import ModelMessage +from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel + +import band.adapters.pydantic_ai as pydantic_adapter +from band.adapters.pydantic_ai import PydanticAIAdapter +from band.core.types import PlatformMessage +from band.runtime.tools import BandTool +from band.testing import FakeAgentTools + + +class TestNativeDiagnostics: + @pytest.mark.parametrize( + ("first_tool", "native_text", "expected_metadata"), + [ + ( + None, + "private native reply", + "output_type=str, output_chars=20, tool_calls=0, tool_results=0, failed_tool_results=0", + ), + ( + None, + " ", + "output_type=NoneType, output_chars=0, tool_calls=0, tool_results=0, failed_tool_results=0", + ), + ( + BandTool.SEND_MESSAGE, + "private native reply", + "output_type=str, output_chars=20, tool_calls=1, tool_results=1, failed_tool_results=1", + ), + (BandTool.NO_REPLY, "private native reply", None), + ], + ) + async def test_native_outcomes_are_distinguishable_without_logging_content( + self, + sample_message: PlatformMessage, + caplog: pytest.LogCaptureFixture, + first_tool: BandTool | None, + native_text: str, + expected_metadata: str | None, + ) -> None: + requests = 0 + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: + nonlocal requests + requests += 1 + if first_tool is not None and requests == 1: + yield {0: DeltaToolCall(name=first_tool, json_args="{}")} + else: + yield native_text + + adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) + await adapter.on_started("Bot", "Bot") + tools = FakeAgentTools(room_id=sample_message.room_id) + with caplog.at_level(logging.WARNING, logger=pydantic_adapter.__name__): + await adapter.on_message( + msg=sample_message, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id=tools.room_id, + ) + if expected_metadata is None: + assert "native run ended without a turn outcome" not in caplog.text + assert tools.turn.replied + else: + assert expected_metadata in caplog.text + assert not tools.turn.complete + assert "private native reply" not in caplog.text diff --git a/tests/adapters/pydanticai/test_nativeprogress.py b/tests/adapters/pydanticai/test_nativeprogress.py new file mode 100644 index 000000000..62d70c0b7 --- /dev/null +++ b/tests/adapters/pydanticai/test_nativeprogress.py @@ -0,0 +1,205 @@ +"""Native run progress remains observable without logging room contents.""" + +from __future__ import annotations + +import asyncio +import json +import logging +from collections.abc import AsyncIterator +from dataclasses import replace + +import pytest +from pydantic_ai.messages import ModelMessage +from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel + +from band.adapters.pydantic_ai import ( + PydanticAIAdapter, + _log_native_progress, + _native_turn, +) +from band.core.types import Emit, PlatformMessage +from band.runtime.tools import BandTool +from band.testing import FakeAgentTools, failure_reports, reported_failures +from tests.adapters.pydanticai.kit import ( + _assert_billed_responses, + _reply_arguments, + _run_on_message, + _streamed_tool_calls, +) + + +class TestNativeDiagnostics: + @pytest.mark.asyncio + async def test_initial_acknowledgement_then_decline_finishes_without_replay( + self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture + ) -> None: + requests = 0 + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[dict[int, DeltaToolCall]]: + nonlocal requests + requests += 1 + replying = requests == 1 + yield { + 0: DeltaToolCall( + name=BandTool.SEND_MESSAGE if replying else BandTool.NO_REPLY, + json_args=json.dumps( + _reply_arguments(sample_message, "Noted") + if replying + else {"reason": "Already acknowledged"} + ), + ) + } + + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + tools = FakeAgentTools(room_id=sample_message.room_id) + adapter = PydanticAIAdapter( + llm=FunctionModel(stream_function=stream), emit=Emit.USAGE + ) + await _run_on_message(adapter, sample_message, tools) + + assert requests == 2 + assert tools.chat == ["Noted"] + assert reported_failures(tools) == [] + assert "phase=run_completed" in caplog.text + _assert_billed_responses( + tools, adapter._message_history[tools.room_id], model_requests=2 + ) + + @pytest.mark.asyncio + async def test_streamed_tool_turn_keeps_effects_and_redacts_payloads( + self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture + ) -> None: + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + message = replace(sample_message, content="private prompt body") + tools = FakeAgentTools(room_id=message.room_id) + adapter = PydanticAIAdapter( + llm=_streamed_tool_calls( + ( + BandTool.SEND_MESSAGE, + {"content": "private tool body", "mentions": ["Alice"]}, + ) + ) + ) + + await _run_on_message(adapter, message, tools) + + tools.assert_message_sent(content="private tool body") + assert caplog.text.count("phase=request_attempt") == 2 + assert caplog.text.count("phase=response_ready") == 2 + assert "phase=tool_succeeded" in caplog.text + assert f"tool='{BandTool.SEND_MESSAGE}'" in caplog.text + assert f"room={message.room_id} message={message.id}" in caplog.text + assert ( + caplog.text.index("phase=result_received") + < caplog.text.index("phase=iterator_completed") + < caplog.text.index("phase=run_completed") + ) + assert "private prompt body" not in caplog.text + assert "private tool body" not in caplog.text + + @pytest.mark.asyncio + @pytest.mark.parametrize( + "yield_first", [False, True], ids=["before-first", "midstream"] + ) + async def test_stream_error_is_observed_and_preserves_exception( + self, + sample_message: PlatformMessage, + caplog: pytest.LogCaptureFixture, + yield_first: bool, + ) -> None: + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + failure = RuntimeError("private provider error body") + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str]: + if yield_first: + yield "private response body" + raise failure + + tools = FakeAgentTools(room_id=sample_message.room_id) + adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) + + with pytest.raises(RuntimeError) as raised: + await _run_on_message(adapter, sample_message, tools) + + assert raised.value is failure + assert "phase=run_error" in caplog.text + assert "error=RuntimeError" in caplog.text + assert "phase=response_ready" not in caplog.text + assert "phase=run_completed" not in caplog.text + assert "private provider error body" not in caplog.text + assert "private response body" not in caplog.text + assert len(failure_reports(tools)) == 1 + + @pytest.mark.asyncio + async def test_cancellation_closes_native_stream_without_reporting_failure( + self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture + ) -> None: + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + blocked = asyncio.Event() + closed = asyncio.Event() + release = asyncio.Event() + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str]: + try: + yield "private response body" + blocked.set() + await release.wait() + finally: + closed.set() + + tools = FakeAgentTools(room_id=sample_message.room_id) + adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) + async with asyncio.TaskGroup() as tasks: + task = tasks.create_task(_run_on_message(adapter, sample_message, tools)) + await asyncio.wait_for(blocked.wait(), timeout=5) + task.cancel() + + assert task.cancelled() + assert closed.is_set() + assert "phase=stream_progress" in caplog.text + assert "phase=run_cancelled" in caplog.text + assert "error=CancelledError" in caplog.text + assert "phase=response_ready" not in caplog.text + assert "phase=run_completed" not in caplog.text + assert "private response body" not in caplog.text + assert not failure_reports(tools) + + @pytest.mark.asyncio + async def test_long_stream_reports_bounded_progress( + self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture + ) -> None: + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + + async def stream( + messages: list[ModelMessage], info: AgentInfo + ) -> AsyncIterator[str]: + for _ in range(128): + yield "private token" + + adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) + await _run_on_message( + adapter, sample_message, FakeAgentTools(room_id=sample_message.room_id) + ) + + assert 1 < caplog.text.count("phase=stream_progress") <= 9 + assert "phase=run_completed" in caplog.text + assert "private token" not in caplog.text + + def test_progress_lines_are_debug(self, caplog: pytest.LogCaptureFixture) -> None: + """Boundary traces stay off the default INFO log.""" + token = _native_turn.set(("room-1", "msg-1", 0.0)) + try: + caplog.set_level(logging.INFO, logger="band.adapters.pydantic_ai") + _log_native_progress("run_completed") + assert "phase=run_completed" not in caplog.text + caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") + _log_native_progress("run_completed") + finally: + _native_turn.reset(token) + assert "phase=run_completed" in caplog.text diff --git a/tests/adapters/pydanticai/test_oncleanup.py b/tests/adapters/pydanticai/test_oncleanup.py new file mode 100644 index 000000000..9546eca87 --- /dev/null +++ b/tests/adapters/pydanticai/test_oncleanup.py @@ -0,0 +1,27 @@ +"""OnCleanup behavior for Pydantic AI.""" + +from __future__ import annotations + +import pytest +from pydantic_ai.messages import ModelRequest, UserPromptPart + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig + + +class TestOnCleanup: + """Tests for on_cleanup() method.""" + + @pytest.mark.asyncio + async def test_cleans_up_room_history(self): + """Should remove room history on cleanup.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + # Add some history + adapter._message_history["room-123"] = [ + ModelRequest(parts=[UserPromptPart(content="test")]) + ] + assert "room-123" in adapter._message_history + + await adapter.on_cleanup("room-123") + + assert "room-123" not in adapter._message_history diff --git a/tests/adapters/pydanticai/test_onmessage.py b/tests/adapters/pydanticai/test_onmessage.py new file mode 100644 index 000000000..aeca25526 --- /dev/null +++ b/tests/adapters/pydanticai/test_onmessage.py @@ -0,0 +1,178 @@ +"""OnMessage behavior for Pydantic AI.""" + +from __future__ import annotations + +from unittest.mock import MagicMock, patch + +import pytest +from pydantic_ai.messages import ModelRequest, ModelResponse, TextPart, UserPromptPart + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.core.protocols import TurnResultAlreadyReported +from band.testing import MISSING_REPLY_FAILURE, FakeAgentTools, failure_reports +from tests.adapters.pydanticai.kit import make_stream_events +from tests.framework_conformance.turnprobes import ROOM_ID, turn_input + + +class TestOnMessage: + """Tests for on_message() method.""" + + @pytest.mark.asyncio + async def test_initializes_history_on_bootstrap( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should initialize room history on first message.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + result_messages = [ModelRequest(parts=[UserPromptPart(content="test")])] + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=result_messages, + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + assert "room-123" in adapter._message_history + + @pytest.mark.asyncio + async def test_loads_existing_history( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should load historical messages on bootstrap.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + existing_history = [ + ModelRequest(parts=[UserPromptPart(content="[Bob]: Previous message")]), + ModelResponse(parts=[TextPart(content="Previous response")]), + ] + + result_messages = existing_history + [ + ModelRequest(parts=[UserPromptPart(content="new")]) + ] + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=result_messages, + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=existing_history, + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Verify history was passed to agent.run_stream_events() + call_kwargs = adapter._agent.run_stream_events.call_args.kwargs + assert "message_history" in call_kwargs + assert len(call_kwargs["message_history"]) == 2 + + @pytest.mark.asyncio + async def test_injects_participants_message( + self, sample_message, mock_tools, mock_pydantic_agent + ): + """Should inject participants update when provided.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg="Alice joined the room", + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + # Check that participant message was added to history before run + call_kwargs = adapter._agent.run_stream_events.call_args.kwargs + message_history = call_kwargs.get("message_history", []) + # First message should be the participant update + if message_history: + first_msg = message_history[0] + assert isinstance(first_msg, ModelRequest) + assert "[System]: Alice joined" in first_msg.parts[0].content + + @pytest.mark.asyncio + async def test_creates_agent_lazily_if_not_started( + self, sample_message, mock_tools + ): + """Should create agent lazily if on_started wasn't called.""" + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig( + model="openai:gpt-5.4", custom_section="Test section" + ) + ) + # Don't call on_started - set agent_name directly for prompt rendering + adapter.agent_name = "LazyBot" + + with patch.object(adapter, "_create_agent") as mock_create: + mock_agent = MagicMock() + mock_agent.run_stream_events = MagicMock( + return_value=make_stream_events( + result_messages=[], + tool_results=[("band_send_message", "Message sent", "call-1")], + ) + ) + mock_create.return_value = mock_agent + + await adapter.on_message( + msg=sample_message, + tools=mock_tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id="room-123", + ) + + mock_create.assert_called_once() + + @pytest.mark.asyncio + async def test_a_turn_that_never_replied_is_reported_by_the_verdict( + self, mock_pydantic_agent + ): + """A clean run that never replied, declined or acted is a silently + dropped turn — the shared verdict reports it, even without an exception.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started("TestBot", "Test bot") + adapter._agent.run_stream_events = MagicMock( + return_value=make_stream_events(result_messages=[]) + ) + tools = FakeAgentTools(room_id=ROOM_ID) + + with pytest.raises(TurnResultAlreadyReported): + await adapter.on_event(turn_input(tools)) + + assert failure_reports(tools) == [MISSING_REPLY_FAILURE] diff --git a/tests/adapters/pydanticai/test_onstarted.py b/tests/adapters/pydanticai/test_onstarted.py new file mode 100644 index 000000000..3fd191775 --- /dev/null +++ b/tests/adapters/pydanticai/test_onstarted.py @@ -0,0 +1,82 @@ +"""OnStarted behavior for Pydantic AI.""" + +from __future__ import annotations + +from unittest.mock import patch + +import pytest + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.core.types import Capability + + +class TestOnStarted: + """Tests for on_started() method.""" + + @pytest.mark.asyncio + async def test_sets_agent_name_and_description(self, mock_pydantic_agent): + """Should set agent_name and agent_description.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started( + agent_name="TestBot", agent_description="A test bot" + ) + + assert adapter.agent_name == "TestBot" + assert adapter.agent_description == "A test bot" + + @pytest.mark.asyncio + async def test_creates_pydantic_agent(self, mock_pydantic_agent): + """Should create Pydantic AI agent after start.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + assert adapter._agent is None + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started( + agent_name="TestBot", agent_description="A test bot" + ) + + assert adapter._agent is not None + + @pytest.mark.asyncio + async def test_persists_rendered_system_prompt(self): + """Should persist rendered prompt for capability-gating visibility.""" + with patch("band.adapters.pydantic_ai.Agent"): + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="test"), + capabilities=Capability.MEMORY, + ) + await adapter.on_started( + agent_name="TestBot", agent_description="A test bot" + ) + + assert adapter._system_prompt is not None + assert "Memory Tools" in adapter._system_prompt + + @pytest.mark.asyncio + async def test_agent_has_tools_registered(self, mock_pydantic_agent): + """Should register all platform tools on the agent.""" + adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) + + with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): + await adapter.on_started( + agent_name="TestBot", agent_description="A test bot" + ) + + # Get registered tool names + tool_names = list(adapter._agent._function_tools.keys()) + + expected_tools = [ + "band_send_message", + "band_send_event", + "band_add_participant", + "band_remove_participant", + "band_lookup_peers", + "band_get_participants", + "band_create_chatroom", + ] + + for tool in expected_tools: + assert tool in tool_names, f"Tool {tool} not found" diff --git a/tests/adapters/pydanticai/test_portablecustomtooldef.py b/tests/adapters/pydanticai/test_portablecustomtooldef.py new file mode 100644 index 000000000..a2097c9f6 --- /dev/null +++ b/tests/adapters/pydanticai/test_portablecustomtooldef.py @@ -0,0 +1,134 @@ +"""PortableCustomToolDef behavior for Pydantic AI.""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import pytest +from pydantic import BaseModel, Field + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.testing import FakeAgentTools +from tests.adapters.pydanticai.kit import ( + _portable_tool_agent, + _run_portable_tool, + _scripted_tool_calls, +) +from tests.framework_conformance.turnprobes import CUSTOM_TOOL_DECLARATIONS + + +class TestPortableCustomToolDef: + """pydantic accepts the portable CustomToolDef (InputModel, handler) tuple form — + the same custom-tool shape anthropic/crewai/claude_sdk/langgraph take.""" + + @pytest.mark.asyncio + async def test_tuple_is_normalized_to_a_named_callable(self): + + class LookupInput(BaseModel): + """look up a code.""" + + key: str + + def lookup(args: LookupInput) -> str: + return f"code:{args.key}" + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="openai:gpt-5.4"), + additional_tools=[(LookupInput, lookup)], + ) + # Normalized to a native callable named from the model (not the handler). + assert [t.__name__ for t in adapter._custom_tools] == ["lookup"] + + def test_converted_tuple_flattens_in_pydantic_ai(self): + + class LookupInput(BaseModel): + """look up a code.""" + + key: str + + def lookup(args: LookupInput) -> str: + return f"code:{args.key}" + + (tool,) = _portable_tool_agent( + (LookupInput, lookup) + )._function_toolset.tools.values() + schema = tool.function_schema.json_schema + # pydantic-ai flattens the single model param into the tool's args. + assert tool.name == "lookup" + assert sorted((schema.get("properties") or {}).keys()) == ["key"] + + @pytest.mark.asyncio + async def test_async_handler_tuple_is_awaited_end_to_end(self): + """An async CustomToolDef handler returns its awaited value through a real + pydantic-ai run — not an unawaited coroutine (which the previous sync + passthrough produced, failing serialization).""" + + class LookupInput(BaseModel): + """look up a code.""" + + key: str + + async def lookup(args: LookupInput) -> str: + return f"code:{args.key}" + + (content,) = await _run_portable_tool((LookupInput, lookup)) + assert isinstance(content, str) + assert content.startswith("code:") + + @pytest.mark.asyncio + async def test_zero_arg_handler_tuple_runs_end_to_end(self): + """A zero-argument handler with an empty InputModel executes through a real + pydantic-ai run — the previous sync passthrough called it with one + positional arg and raised TypeError.""" + + class PingInput(BaseModel): + """ping.""" + + def ping() -> str: + return "pong" + + assert await _run_portable_tool((PingInput, ping)) == ["pong"] + + @pytest.mark.asyncio + async def test_aliased_input_model_runs_end_to_end(self): + """An InputModel using a field alias executes through a real pydantic-ai + run — a dump/re-validate round-trip would emit field names and fail + re-validation against the alias-only model.""" + + class AliasedInput(BaseModel): + """look up a user.""" + + user_id: str = Field(alias="userId") + + def lookup(args: AliasedInput) -> str: + return f"user:{args.user_id}" + + (content,) = await _run_portable_tool((AliasedInput, lookup)) + assert isinstance(content, str) + assert content.startswith("user:") + + @pytest.mark.asyncio + @pytest.mark.parametrize(("declare", "complete"), CUSTOM_TOOL_DECLARATIONS) + async def test_custom_tool_records_its_effect_on_the_room_turn( + self, declare: Callable[..., Any], complete: bool + ): + class FileInput(BaseModel): + """File the report.""" + + note: str + + @declare + def file_report(args: FileInput) -> str: + return "filed" + + tools = FakeAgentTools() + adapter = PydanticAIAdapter( + llm=_scripted_tool_calls(("file", {"note": "go"})), + additional_tools=[(FileInput, file_report)], + ) + adapter.agent_name = "TestBot" + + await adapter._create_agent().run("go", deps=tools) + + assert tools.turn.complete is complete diff --git a/tests/adapters/pydanticai/test_provider.py b/tests/adapters/pydanticai/test_provider.py new file mode 100644 index 000000000..a54a72279 --- /dev/null +++ b/tests/adapters/pydanticai/test_provider.py @@ -0,0 +1,54 @@ +"""Model strings start the upstream HTTPX2 provider and execute a real tool loop.""" + +from __future__ import annotations + +import warnings + +import httpx2 +import pytest +from pydantic_ai.models import infer_model + +from band.adapters.pydantic_ai import PydanticAIAdapter, PydanticAIAdapterConfig +from band.testing import FakeAgentTools +from tests.adapters.pydanticai.providerpeer import ProviderPeer + + +class TestProvider: + @pytest.mark.parametrize("alias", ["openai", "openai-chat"]) + async def test_default_provider_executes_a_tool_round_trip( + self, monkeypatch: pytest.MonkeyPatch, alias: str + ) -> None: + peer = ProviderPeer() + recorded: list[str] = [] + + def record(note: str) -> str: + """Record a note.""" + recorded.append(note) + return "recorded" + + with peer.serve() as base_url, warnings.catch_warnings(record=True) as captured: + warnings.simplefilter("always") + monkeypatch.setenv("OPENAI_API_KEY", "test") + monkeypatch.setenv("OPENAI_BASE_URL", base_url) + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model=f"{alias}:configured-model"), + additional_tools=[record], + ) + await adapter.on_started("Bot", "A bot") + assert adapter._agent is not None + async with adapter._agent as agent: + result = await agent.run("record hello", deps=FakeAgentTools()) + assert result.output == "done" + model = infer_model(f"{alias}:configured-model") + assert isinstance(model.provider.client._client, httpx2.AsyncClient) + await model.provider.client.close() + + assert recorded == ["hello"] + assert peer.tool_results() == ["recorded"] + assert len(peer.requests) == 2 + assert all(request["model"] == "configured-model" for request in peer.requests) + assert not [ + warning + for warning in captured + if "httpx.AsyncClient" in str(warning.message) + ] diff --git a/tests/adapters/pydanticai/test_usagemapping.py b/tests/adapters/pydanticai/test_usagemapping.py new file mode 100644 index 000000000..9790902f0 --- /dev/null +++ b/tests/adapters/pydanticai/test_usagemapping.py @@ -0,0 +1,107 @@ +"""UsageMapping behavior for Pydantic AI.""" + +from __future__ import annotations + +from types import SimpleNamespace +from typing import Any + +from pydantic_ai.messages import ModelRequest, UserPromptPart + +from band.adapters.pydantic_ai import PydanticAIAdapter +from band.core.types import TurnUsage +from tests.adapters.pydanticai.kit import make_usage_response + + +class TestUsageMapping: + """Tests for the Emit.USAGE seam's usage mapping.""" + + def test_usage_from_result_reads_the_usage_property(self): + """Maps the run result's ``usage`` (a property since 2.x) onto TurnUsage. + + Reading it as a method instead would raise, and the guarded read would then + report zeros for every turn — silent, so this is the guard. + """ + + result = SimpleNamespace( + usage=SimpleNamespace( + input_tokens=100, + output_tokens=20, + cache_read_tokens=5, + cache_write_tokens=0, + ) + ) + assert PydanticAIAdapter._usage_from_result(result) == TurnUsage( + input_tokens=100, + output_tokens=20, + cache_read_tokens=5, + cache_write_tokens=0, + ) + + def test_usage_from_result_swallows_errors(self): + """Usage that fails to read yields empty usage, never propagates.""" + + class Unreadable: + @property + def usage(self) -> Any: + raise RuntimeError("no usage") + + assert PydanticAIAdapter._usage_from_result(Unreadable()) == TurnUsage() + + def test_usage_from_messages_sums_model_responses(self): + """The benign-path fallback sums usage across captured ModelResponses. + + Covers the empty-final-response path (no AgentRunResultEvent fires) where + the turn still spent tokens — each ModelResponse carries its own usage. + """ + + messages = [ + ModelRequest(parts=[]), # non-response: ignored + make_usage_response(100, 20), + make_usage_response(130, 8), + ] + assert PydanticAIAdapter._usage_from_messages(messages) == TurnUsage( + input_tokens=230, output_tokens=28 + ) + + def test_usage_from_messages_empty_when_no_responses(self): + """No ModelResponse in the captured messages → empty usage.""" + + assert ( + PydanticAIAdapter._usage_from_messages([ModelRequest(parts=[])]) + == TurnUsage() + ) + + def test_new_run_messages_isolates_this_run_despite_history_merge(self): + """Identity (not position) isolates this run when pydantic-ai merges history. + + Regression guard: pydantic-ai's ``_clean_message_history`` merges adjacent + same-type messages in the passed history (e.g. the injected participants + + contacts requests), so ``captured`` is *shorter* than the raw prior history + and a ``len(prior)`` slice would drop this turn's response. Real API + responses keep their identity, so the identity filter still isolates this + run — and combined with the ModelResponse-only sum, yields only this turn's + usage. + """ + + # Prior history: a real response, then two instruction-less requests that + # pydantic-ai would merge into one on the next run. + prior_resp = make_usage_response(100, 20) + req_participants = ModelRequest(parts=[UserPromptPart(content="[System]: p")]) + req_contacts = ModelRequest(parts=[UserPromptPart(content="[System]: c")]) + prior = [prior_resp, req_participants, req_contacts] + prior_ids = {id(m) for m in prior} + + # captured after cleaning: prior_resp survives by identity, the two + # requests are merged into ONE new object, then this run's new response is + # appended. So len(captured)=3 < len(prior)=3+... a positional + # captured[len(prior):] would slice to empty and drop new_resp. + merged_req = ModelRequest(parts=[UserPromptPart(content="[System]: p\nc")]) + new_resp = make_usage_response(130, 8) + captured = [prior_resp, merged_req, new_resp] + + this_run = PydanticAIAdapter._new_run_messages(captured, prior_ids) + # The merged request (new identity) rides along but carries no usage; only + # this run's response contributes. + assert PydanticAIAdapter._usage_from_messages(this_run) == TurnUsage( + input_tokens=130, output_tokens=8 + ) diff --git a/tests/adapters/test_pydantic_ai_adapter.py b/tests/adapters/test_pydantic_ai_adapter.py index b5670d18a..d977e2c14 100644 --- a/tests/adapters/test_pydantic_ai_adapter.py +++ b/tests/adapters/test_pydantic_ai_adapter.py @@ -1,334 +1,36 @@ -"""Tests for PydanticAIAdapter. - -Tests for shared adapter behavior (initialization defaults, custom kwargs, -history_converter, on_message callable, cleanup safety) live in -tests/framework_conformance/test_adapter_conformance.py. -This file contains PydanticAI-specific behavior: agent creation, tool registration, -stream event handling, execution reporting, and custom tools. -""" +"""Initialization behavior for Pydantic AI.""" from __future__ import annotations -import asyncio -import contextlib -import json -import logging -from collections.abc import AsyncIterator, Awaitable, Callable, Iterator -from contextlib import asynccontextmanager, contextmanager -from dataclasses import replace -from datetime import UTC, datetime -from pathlib import Path -from types import SimpleNamespace -from typing import Any, NamedTuple -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import MagicMock, patch -import httpx import pytest -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import SimpleSpanProcessor -from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter -from pydantic import BaseModel, Field -from pydantic_ai import ( - Agent, - AgentRunResultEvent, - FunctionToolCallEvent, - FunctionToolResultEvent, - InstrumentationSettings, - PydanticAIDeprecationWarning, - RunContext, - UnexpectedModelBehavior, - _tool_execution, -) +from pydantic import BaseModel from pydantic_ai.capabilities import ProcessHistory from pydantic_ai.messages import ( - BinaryContent, ModelMessage, - ModelRequest, ModelResponse, - NativeToolCallPart, - RetryPromptPart, TextPart, ThinkingPart, ToolCallPart, - ToolReturnPart, - UserPromptPart, ) -from pydantic_ai.models.function import AgentInfo, DeltaToolCall, FunctionModel -from pydantic_ai.models.openai import OpenAIChatModel, OpenAIResponsesModel +from pydantic_ai.models.function import AgentInfo, FunctionModel from pydantic_ai.models.test import TestModel -from pydantic_ai.usage import UsageLimits from band.adapters.pydantic_ai import ( - OUTPUT_RETRIES_EXHAUSTED, PydanticAIAdapter, PydanticAIAdapterConfig, - _custom_tool_def_to_callable, _drop_non_replayable_messages, - _is_output_retries_exhausted, - _is_replayable_history_message, - _log_native_progress, - _native_turn, - _resolve_pydantic_ai_model, -) -from band.core.exceptions import BandToolError -from band.core.protocols import ( - GENERIC_PROVIDER_FAILURE_MESSAGE, - AgentToolsProtocol, - TurnResultAlreadyReported, -) -from band.core.tool_filter import sanitize_tool_schema -from band.core.types import ( - ALL_CAPABILITIES, - Capability, - Emit, - MessageType, - PlatformMessage, - ToolEventKey, - TurnUsage, ) -from band.runtime.custom_tools import ( - CustomToolDef, - declares_turn_effect, - get_custom_tool_name, +from band.runtime.custom_tools import get_custom_tool_name +from band.testing import FakeAgentTools +from tests.adapters.pydanticai.kit import ( + instrument_all_restored, + mock_pydantic_agent, + mock_tools, + sample_message, + trace_capture, ) -from band.runtime.tools import ( - ALL_TOOL_NAMES, - CHAT_TOOL_NAMES, - CONTACT_TOOL_NAMES, - FILE_TOOL_NAMES, - MEMORY_TOOL_NAMES, - TASK_TOOL_NAMES, - BandTool, - ToolCategory, - TurnEffect, - band_tool_errored, - get_tool_description, - platform_args_schema, -) -from band.testing import ( - MISSING_REPLY_FAILURE, - FakeAgentTools, - events_of_type, - failure_reports, - reported_failures, -) -from tests.adapters.usage_events import recorded_usage_payloads, sent_usage_payloads -from tests.framework_configs.adapters import pydantic_ai_probe_tools -from tests.framework_conformance.turnprobes import ( - CUSTOM_TOOL_DECLARATIONS, - ROOM_ID, - turn_input, -) -from tests.testing.support import seeded_peer - - -def make_stream_events( - result_messages: list | None = None, - tool_calls: list[tuple[str, dict, str]] | None = None, - tool_results: list[tuple[str, str, str]] | None = None, -): - """Stand in for ``Agent.run_stream_events()``: an async CM over stream events. - - pydantic-ai 2.x makes ``run_stream_events()`` an async context manager that - yields the event iterator (it starts the run on first iteration and tears the - background task down on exit), so the fake has to be one too. - - Args: - result_messages: Messages to return in AgentRunResultEvent - tool_calls: List of (tool_name, args, tool_call_id) tuples - tool_results: List of (tool_name, output, tool_call_id) tuples - """ - - async def stream(): - # Emit tool call events - if tool_calls: - for tool_name, args, tool_call_id in tool_calls: - event = MagicMock(spec=FunctionToolCallEvent) - event.part = MagicMock() - event.part.tool_name = tool_name - event.part.args = args - event.part.args_as_dict = MagicMock(return_value=args) - event.part.tool_call_id = tool_call_id - yield event - - # Emit tool result events - if tool_results: - for tool_name, output, tool_call_id in tool_results: - event = MagicMock(spec=FunctionToolResultEvent) - event.part = MagicMock() - event.part.tool_name = tool_name # tool_name is on the part, not event - event.part.content = output - event.tool_call_id = tool_call_id - yield event - - # Always emit final result event - result_event = MagicMock(spec=AgentRunResultEvent) - result_event.result = MagicMock() - result_event.result.all_messages.return_value = result_messages or [] - yield result_event - - @asynccontextmanager - async def events() -> AsyncIterator[AsyncIterator]: - yield stream() - - return events() - - -def make_usage_response( - inp: int, out: int, parts: list[Any] | None = None -) -> ModelResponse: - """A ModelResponse carrying explicit usage counts. - - Real construction (fully initialized, so the dataclass stays repr-safe), - then the usage field is overridden past any frozen/validated assignment. - """ - response = ModelResponse(parts=parts or []) - object.__setattr__( - response, "usage", SimpleNamespace(input_tokens=inp, output_tokens=out) - ) - return response - - -@pytest.fixture -def sample_message(): - """Create a sample platform message.""" - return PlatformMessage( - id="msg-123", - room_id="room-123", - content="Hello, agent!", - sender_id="user-456", - sender_type="User", - sender_name="Alice", - message_type="text", - metadata={}, - created_at=datetime.now(UTC), - ) - - -@pytest.fixture -def mock_tools(): - """Create mock AgentToolsProtocol (MagicMock base, AsyncMock methods).""" - tools = MagicMock() - tools.send_message = AsyncMock(return_value={"status": "sent"}) - tools.send_event = AsyncMock(return_value={"status": "sent"}) - tools.send_failure = AsyncMock(return_value={"status": "sent"}) - tools.add_participant = AsyncMock(return_value={"id": "user-1"}) - tools.remove_participant = AsyncMock(return_value={"status": "removed"}) - tools.lookup_peers = AsyncMock(return_value={"peers": []}) - tools.get_participants = AsyncMock(return_value=[]) - tools.create_chatroom = AsyncMock(return_value="new-room-123") - return tools - - -@pytest.fixture -def mock_pydantic_agent(): - """Create a mock Pydantic AI Agent.""" - agent = MagicMock() - agent._function_tools = { - "band_send_message": MagicMock(name="band_send_message"), - "band_send_event": MagicMock(name="band_send_event"), - "band_add_participant": MagicMock(name="band_add_participant"), - "band_remove_participant": MagicMock(name="band_remove_participant"), - "band_lookup_peers": MagicMock(name="band_lookup_peers"), - "band_get_participants": MagicMock(name="band_get_participants"), - "band_create_chatroom": MagicMock(name="band_create_chatroom"), - } - return agent - - -class TestUsageMapping: - """Tests for the Emit.USAGE seam's usage mapping.""" - - def test_usage_from_result_reads_the_usage_property(self): - """Maps the run result's ``usage`` (a property since 2.x) onto TurnUsage. - - Reading it as a method instead would raise, and the guarded read would then - report zeros for every turn — silent, so this is the guard. - """ - - result = SimpleNamespace( - usage=SimpleNamespace( - input_tokens=100, - output_tokens=20, - cache_read_tokens=5, - cache_write_tokens=0, - ) - ) - assert PydanticAIAdapter._usage_from_result(result) == TurnUsage( - input_tokens=100, - output_tokens=20, - cache_read_tokens=5, - cache_write_tokens=0, - ) - - def test_usage_from_result_swallows_errors(self): - """Usage that fails to read yields empty usage, never propagates.""" - - class Unreadable: - @property - def usage(self) -> Any: - raise RuntimeError("no usage") - - assert PydanticAIAdapter._usage_from_result(Unreadable()) == TurnUsage() - - def test_usage_from_messages_sums_model_responses(self): - """The benign-path fallback sums usage across captured ModelResponses. - - Covers the empty-final-response path (no AgentRunResultEvent fires) where - the turn still spent tokens — each ModelResponse carries its own usage. - """ - - messages = [ - ModelRequest(parts=[]), # non-response: ignored - make_usage_response(100, 20), - make_usage_response(130, 8), - ] - assert PydanticAIAdapter._usage_from_messages(messages) == TurnUsage( - input_tokens=230, output_tokens=28 - ) - - def test_usage_from_messages_empty_when_no_responses(self): - """No ModelResponse in the captured messages → empty usage.""" - - assert ( - PydanticAIAdapter._usage_from_messages([ModelRequest(parts=[])]) - == TurnUsage() - ) - - def test_new_run_messages_isolates_this_run_despite_history_merge(self): - """Identity (not position) isolates this run when pydantic-ai merges history. - - Regression guard: pydantic-ai's ``_clean_message_history`` merges adjacent - same-type messages in the passed history (e.g. the injected participants + - contacts requests), so ``captured`` is *shorter* than the raw prior history - and a ``len(prior)`` slice would drop this turn's response. Real API - responses keep their identity, so the identity filter still isolates this - run — and combined with the ModelResponse-only sum, yields only this turn's - usage. - """ - - # Prior history: a real response, then two instruction-less requests that - # pydantic-ai would merge into one on the next run. - prior_resp = make_usage_response(100, 20) - req_participants = ModelRequest(parts=[UserPromptPart(content="[System]: p")]) - req_contacts = ModelRequest(parts=[UserPromptPart(content="[System]: c")]) - prior = [prior_resp, req_participants, req_contacts] - prior_ids = {id(m) for m in prior} - - # captured after cleaning: prior_resp survives by identity, the two - # requests are merged into ONE new object, then this run's new response is - # appended. So len(captured)=3 < len(prior)=3+... a positional - # captured[len(prior):] would slice to empty and drop new_resp. - merged_req = ModelRequest(parts=[UserPromptPart(content="[System]: p\nc")]) - new_resp = make_usage_response(130, 8) - captured = [prior_resp, merged_req, new_resp] - - this_run = PydanticAIAdapter._new_run_messages(captured, prior_ids) - # The merged request (new identity) rides along but carries no usage; only - # this run's response contributes. - assert PydanticAIAdapter._usage_from_messages(this_run) == TurnUsage( - input_tokens=130, output_tokens=8 - ) class TestInitialization: @@ -349,31 +51,6 @@ async def test_agent_runs_the_live_llm(self): assert adapter._agent.model is llm - def test_non_openai_models_skip_the_legacy_http_patch(self): - llm = TestModel() - - assert _resolve_pydantic_ai_model(llm) is llm - assert _resolve_pydantic_ai_model("anthropic:claude") == "anthropic:claude" - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("model_name", "model_type"), - [ - ("openai:gpt-4o-mini", OpenAIResponsesModel), - ("openai-chat:gpt-4o-mini", OpenAIChatModel), - ], - ) - async def test_openai_model_strings_use_the_legacy_http_client( - self, monkeypatch: pytest.MonkeyPatch, model_name: str, model_type: type[Any] - ) -> None: - monkeypatch.setenv("OPENAI_API_KEY", "sk-test") - - with pytest.warns(PydanticAIDeprecationWarning, match="httpx.AsyncClient"): - model = _resolve_pydantic_ai_model(model_name) - - assert isinstance(model, model_type) - await model.provider.client.close() - @pytest.mark.parametrize( ("config", "llm"), [ @@ -533,2698 +210,10 @@ def think_only(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: assert result.output is None -class TraceCapture(NamedTuple): - """A tracer wired to memory, plus the settings that route an agent into it.""" - - provider: TracerProvider - settings: InstrumentationSettings - exporter: InMemorySpanExporter - - def operations(self) -> list[str]: - """The exported spans' operation names (``chat``, ``invoke_agent``, ...). - - The full span name carries the model and agent, which the assertions here - don't care about — the question is only whether the run was traced. - """ - return [span.name.split()[0] for span in self.exporter.get_finished_spans()] - - -@pytest.fixture -def trace_capture() -> Iterator[TraceCapture]: - """Host-owned tracer pipeline, exporting to memory instead of a collector.""" - exporter = InMemorySpanExporter() - provider = TracerProvider() - provider.add_span_processor(SimpleSpanProcessor(exporter)) - try: - yield TraceCapture( - provider=provider, - settings=InstrumentationSettings(tracer_provider=provider), - exporter=exporter, - ) - finally: - provider.shutdown() - - -@pytest.fixture -def instrument_all_restored() -> Iterator[None]: - """Undo ``Agent.instrument_all()``; it is process-wide state on the class.""" - previous = Agent._instrument_default - try: - yield - finally: - Agent.instrument_all(previous) - - -def message_types(mock_tools: MagicMock) -> list[str]: - """``message_type`` of every event posted through send_event, in order.""" - return [ - call.kwargs.get("message_type") for call in mock_tools.send_event.call_args_list - ] - - -def _reply(text: str) -> FunctionModel: - """A model that answers in plain text, so a run needs no network or tools.""" - - def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: - return ModelResponse(parts=[TextPart(content=text)]) - - return FunctionModel(respond) - - -class TestInstrumentation: - """Tests for the ``instrument`` pass-through to pydantic-ai. - - Band creates no TracerProvider and no exporter: the host owns the pipeline and - hands the agent an ``InstrumentationSettings`` (or flips ``Agent.instrument_all``). - """ - - def test_settings_route_the_run_into_the_host_tracer( - self, trace_capture: TraceCapture, mock_tools - ): - """Explicit settings trace the model call and the agent run.""" - adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=trace_capture.settings) - adapter.agent_name = "TestBot" - - adapter._create_agent().run_sync("hello", deps=mock_tools) - - assert trace_capture.operations() == ["chat", "invoke_agent"] - - def test_true_traces_through_the_ambient_provider( - self, - trace_capture: TraceCapture, - monkeypatch: pytest.MonkeyPatch, - mock_tools, - ): - """``True`` is the shorthand for a host that published its providers. - - pydantic-ai resolves the ambient ``TracerProvider`` when it builds the - default settings, so this only traces in a process that set one — which - is why examples/opentelemetry hands over settings instead. - """ - monkeypatch.setattr( - "pydantic_ai.models.instrumented.get_tracer_provider", - lambda: trace_capture.provider, - ) - adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=True) - adapter.agent_name = "TestBot" - - adapter._create_agent().run_sync("hello", deps=mock_tools) - - assert trace_capture.operations() == ["chat", "invoke_agent"] - - def test_default_inherits_instrument_all( - self, trace_capture: TraceCapture, instrument_all_restored, mock_tools - ): - """Passing nothing leaves the host's process-wide choice in force.""" - Agent.instrument_all(trace_capture.settings) - adapter = PydanticAIAdapter(llm=_reply("ok")) - adapter.agent_name = "TestBot" - - adapter._create_agent().run_sync("hello", deps=mock_tools) - - assert trace_capture.operations() == ["chat", "invoke_agent"] - - def test_false_opts_out_of_instrument_all( - self, trace_capture: TraceCapture, instrument_all_restored, mock_tools - ): - """``False`` is not "unset": it excludes this agent from a traced process.""" - Agent.instrument_all(trace_capture.settings) - adapter = PydanticAIAdapter(llm=_reply("ok"), instrument=False) - adapter.agent_name = "TestBot" - - adapter._create_agent().run_sync("hello", deps=mock_tools) - - assert trace_capture.operations() == [] - - def test_instrumented_agent_still_drops_content_null_history( - self, trace_capture: TraceCapture, mock_tools - ): - """Instrumentation must not cost the ProcessHistory capability. - - Both ride on the agent, and an implementation that passed instrumentation - as a capability would silently replace the history processor — sending - providers the thinking-only response as assistant ``content: null``. - """ - seen: list[list[ModelMessage]] = [] - - def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: - seen.append(list(messages)) - return ModelResponse(parts=[TextPart(content="ok")]) - - adapter = PydanticAIAdapter( - llm=FunctionModel(respond), instrument=trace_capture.settings - ) - adapter.agent_name = "TestBot" - - adapter._create_agent().run_sync( - "hello", - deps=mock_tools, - message_history=[ - ModelRequest(parts=[UserPromptPart(content="earlier")]), - ModelResponse(parts=[ThinkingPart(content="hmm")]), - ], - ) - - (sent_to_model,) = seen - assert not [m for m in sent_to_model if isinstance(m, ModelResponse)] - assert trace_capture.operations() == ["chat", "invoke_agent"] - - -class TestOnStarted: - """Tests for on_started() method.""" - - @pytest.mark.asyncio - async def test_sets_agent_name_and_description(self, mock_pydantic_agent): - """Should set agent_name and agent_description.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started( - agent_name="TestBot", agent_description="A test bot" - ) - - assert adapter.agent_name == "TestBot" - assert adapter.agent_description == "A test bot" - - @pytest.mark.asyncio - async def test_creates_pydantic_agent(self, mock_pydantic_agent): - """Should create Pydantic AI agent after start.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - assert adapter._agent is None - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started( - agent_name="TestBot", agent_description="A test bot" - ) - - assert adapter._agent is not None - - @pytest.mark.asyncio - async def test_persists_rendered_system_prompt(self): - """Should persist rendered prompt for capability-gating visibility.""" - with patch("band.adapters.pydantic_ai.Agent"): - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="test"), - capabilities=Capability.MEMORY, - ) - await adapter.on_started( - agent_name="TestBot", agent_description="A test bot" - ) - - assert adapter._system_prompt is not None - assert "Memory Tools" in adapter._system_prompt - - @pytest.mark.asyncio - async def test_agent_has_tools_registered(self, mock_pydantic_agent): - """Should register all platform tools on the agent.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started( - agent_name="TestBot", agent_description="A test bot" - ) - - # Get registered tool names - tool_names = list(adapter._agent._function_tools.keys()) - - expected_tools = [ - "band_send_message", - "band_send_event", - "band_add_participant", - "band_remove_participant", - "band_lookup_peers", - "band_get_participants", - "band_create_chatroom", - ] - - for tool in expected_tools: - assert tool in tool_names, f"Tool {tool} not found" - - -def _wire_tool_call_args(args: Any) -> dict[str, Any] | str: - """Shape tool args the way providers send them on the wire (JSON text or object).""" - if isinstance(args, dict | str): - return args - return json.dumps(args) - - -def _scripted_tool_calls(*calls: tuple[str, Any]) -> FunctionModel: - """A model that makes ``calls``, one per turn, then answers in plain text. - - A rejected call brings the model straight back here with nothing left - pending, so it is attempted exactly once — which is what makes "never - dispatched" observable rather than merely slow. - """ - pending = list(calls) - - def respond(messages: list[ModelMessage], info: AgentInfo) -> ModelResponse: - if pending: - name, args = pending.pop(0) - return ModelResponse(parts=[ToolCallPart(name, _wire_tool_call_args(args))]) - return ModelResponse(parts=[TextPart("done")]) - - return FunctionModel(respond) - - -async def _started_adapter(**features: Any) -> PydanticAIAdapter: - """A started adapter, i.e. one whose agent is really built.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test"), **features) - await adapter.on_started(agent_name="Probe", agent_description="probe") - return adapter - - -def _registered_names(adapter: PydanticAIAdapter) -> set[str]: - return set(adapter._agent._function_toolset.tools) - - -async def _call_tool( - adapter: PydanticAIAdapter, deps: Any, name: str, args: Any -) -> Any: - """Drive one built-in tool call through pydantic-ai's own execution path. - - Not the tool function directly: validation, argument splatting and the - retry conversion are pydantic-ai's, and calling the function by hand would - skip every one of them. - """ - with adapter._agent.override(model=_scripted_tool_calls((name, args))): - return await adapter._agent.run("go", deps=deps) - - -def _parts(result: Any, part_type: type) -> list[Any]: - return [ - part - for message in result.all_messages() - for part in message.parts - if isinstance(part, part_type) - ] - - -def _tool_returns(result: Any) -> list[Any]: - return [part.content for part in _parts(result, ToolReturnPart)] - - -def _streamed_tool_calls(*calls: tuple[str, dict[str, Any]]) -> FunctionModel: - """A streaming model (what ``on_message`` drives) making ``calls``, one per - request, then ending with nothing left to say.""" - pending = list(calls) - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: - if pending: - name, args = pending.pop(0) - yield {0: DeltaToolCall(name=name, json_args=json.dumps(args))} - else: - yield "" - - return FunctionModel(stream_function=stream) - - -class DecliningModel: - """A native streaming model that keeps declining if asked again.""" - - def __init__(self) -> None: - self.requests = 0 - self.model = FunctionModel(stream_function=self.stream) - - async def stream( - self, messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[dict[int, DeltaToolCall]]: - self.requests += 1 - yield { - 0: DeltaToolCall( - name=BandTool.NO_REPLY, - json_args=json.dumps({"reason": "Already answered"}), - tool_call_id=f"decline-{self.requests}", - ) - } - - -class TestExplicitDecline: - @pytest.mark.asyncio - @pytest.mark.parametrize("request_limit", [1, 3]) - async def test_decline_ends_native_stream_on_last_allowed_request( - self, request_limit: int - ) -> None: - model = DecliningModel() - adapter = PydanticAIAdapter(llm=model.model) - await adapter.on_started("Probe", "probe") - tools = FakeAgentTools() - results = [] - async with adapter._agent.run_stream_events( - "go", deps=tools, usage_limits=UsageLimits(request_limit=request_limit) - ) as events: - async for event in events: - if isinstance(event, AgentRunResultEvent): - results.append(event.result) - - assert model.requests == 1 - assert len(results) == 1 - assert results[0].output is None - assert _tool_returns(results[0]) == [{"status": "no_reply"}] - assert tools.turn.replied - assert reported_failures(tools) == [] - - @pytest.mark.asyncio - async def test_adapter_preserves_decline_events_history_and_per_turn_usage( - self, sample_message: PlatformMessage - ) -> None: - model = DecliningModel() - adapter = PydanticAIAdapter(llm=model.model, emit=(Emit.TOOL_CALLS, Emit.USAGE)) - await adapter.on_started("Probe", "probe") - tools = FakeAgentTools() - await _run_on_message(adapter, sample_message, tools) - - assert model.requests == 1 - assert _emitted_tool_results(tools) == [ - (BandTool.NO_REPLY, "{'status': 'no_reply'}", "decline-1") - ] - prior = list(adapter._message_history[tools.room_id]) - assert _history_tool_returns(prior) == [ - (BandTool.NO_REPLY, "decline-1", {"status": "no_reply"}) - ] - assert all(_is_replayable_history_message(message) for message in prior) - _assert_billed_responses(tools, prior) - assert reported_failures(tools) == [] - - seen_history: list[ModelMessage] = [] - - async def followup( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: - if not seen_history: - seen_history.extend(messages) - yield { - 0: DeltaToolCall( - name=BandTool.SEND_MESSAGE, - json_args=json.dumps( - _reply_arguments(sample_message, "A fresh reply") - ), - ) - } - else: - yield "done" - - next_tools = FakeAgentTools(room_id=tools.room_id) - with adapter._agent.override(model=FunctionModel(stream_function=followup)): - await adapter.on_message( - msg=sample_message, - tools=next_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=False, - room_id=tools.room_id, - ) - - assert _history_tool_returns(seen_history) == _history_tool_returns(prior) - assert next_tools.chat[0] == "A fresh reply" - new_history = adapter._message_history[tools.room_id][len(prior) :] - _assert_billed_responses(next_tools, new_history, model_requests=2) - - @pytest.mark.asyncio - @pytest.mark.parametrize( - "rejection", - [RuntimeError("decline rejected"), {"ok": False}, None], - ids=["raised", "returned_failure", "invalid_arguments"], - ) - async def test_failed_decline_keeps_required_reply_executable( - self, sample_message: PlatformMessage, rejection: Any - ) -> None: - tools = FakeAgentTools() - if isinstance(rejection, Exception): - tools.no_reply = AsyncMock(side_effect=rejection) - elif rejection is not None: - tools.no_reply = AsyncMock(return_value=rejection) - decline_args = ( - {"unexpected": True} if rejection is None else {"reason": "decline"} - ) - adapter = await _started_adapter() - with adapter._agent.override( - model=_streamed_tool_calls( - (BandTool.NO_REPLY, decline_args), - ( - BandTool.SEND_MESSAGE, - _reply_arguments(sample_message, "Required reply"), - ), - ) - ): - await _run_on_message(adapter, sample_message, tools) - - assert tools.chat == ["Required reply"] - assert reported_failures(tools) == [] - - @pytest.mark.asyncio - @pytest.mark.parametrize( - "first_tool", [BandTool.SEND_MESSAGE, BandTool.GET_PARTICIPANTS, "do_work"] - ) - async def test_other_successful_tools_do_not_end_the_loop( - self, sample_message: PlatformMessage, first_tool: str - ) -> None: - work_done = [] - - @declares_turn_effect(TurnEffect.ACT) - async def do_work() -> str: - work_done.append("worked") - return "worked" - - tools = FakeAgentTools() - adapter = await _started_adapter(additional_tools=[do_work]) - arguments = ( - _reply_arguments(sample_message, "First reply") - if first_tool == BandTool.SEND_MESSAGE - else {} - ) - with adapter._agent.override( - model=_streamed_tool_calls( - (first_tool, arguments), - ( - BandTool.SEND_MESSAGE, - _reply_arguments(sample_message, "Required next reply"), - ), - ) - ): - await _run_on_message(adapter, sample_message, tools) - - assert tools.chat[-1] == "Required next reply" - if first_tool == "do_work": - assert work_done == ["worked"] - assert reported_failures(tools) == [] - - @pytest.mark.asyncio - async def test_decline_preserves_every_result_in_its_tool_batch( - self, sample_message: PlatformMessage - ) -> None: - async def batch( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[dict[int, DeltaToolCall]]: - yield { - 0: DeltaToolCall( - name=BandTool.NO_REPLY, json_args="{}", tool_call_id="decline" - ), - 1: DeltaToolCall( - name=BandTool.SEND_MESSAGE, - json_args=json.dumps( - _reply_arguments(sample_message, "Already sent") - ), - tool_call_id="reply", - ), - 2: DeltaToolCall( - name=BandTool.GET_PARTICIPANTS, json_args="{}", tool_call_id="read" - ), - } - - adapter = PydanticAIAdapter( - llm=FunctionModel(stream_function=batch), emit=Emit.TOOL_CALLS - ) - await adapter.on_started("Probe", "probe") - tools = FakeAgentTools() - await _run_on_message(adapter, sample_message, tools) - - returns = _history_tool_returns(adapter._message_history[tools.room_id]) - assert {(name, call_id) for name, call_id, _ in returns} == { - (BandTool.NO_REPLY, "decline"), - (BandTool.SEND_MESSAGE, "reply"), - (BandTool.GET_PARTICIPANTS, "read"), - } - assert { - (name, call_id) for name, _, call_id in _emitted_tool_results(tools) - } == {(name, call_id) for name, call_id, _ in returns} - assert tools.chat == ["Already sent"] - assert reported_failures(tools) == [] - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("failure", "shown"), - [ - ("raised", "Error executing band_send_message: post failed"), - ("returned_failure", "{'ok': False}"), - ("invalid_arguments", "Invalid arguments for band_send_message"), - ], - ) - async def test_a_failed_sibling_keeps_the_decline_batch_open( - self, sample_message: PlatformMessage, failure: str, shown: str - ) -> None: - """A successful decline leaves the loop running when another tool in the same response failed.""" - tools = FakeAgentTools() - if failure != "invalid_arguments": - send_message = tools.send_message - - async def fail_named_post( - content: str, - mentions: list[str] | list[dict[str, str]] | None = None, - ) -> Any: - if content != "Will fail": - return await send_message(content, mentions) - if failure == "raised": - raise RuntimeError("post failed") - return {"ok": False} - - tools.send_message = fail_named_post - - requests = 0 - followup: list[ModelMessage] = [] - send_arguments: dict[str, Any] = ( - {"content": "Will fail", "mentions": "alice"} - if failure == "invalid_arguments" - else _reply_arguments(sample_message, "Will fail") - ) - - async def batch( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: - nonlocal requests - requests += 1 - if requests == 1: - yield { - 0: DeltaToolCall( - name=BandTool.NO_REPLY, - json_args=json.dumps({"reason": "Settled"}), - tool_call_id="decline", - ), - 1: DeltaToolCall( - name=BandTool.SEND_MESSAGE, - json_args=json.dumps(send_arguments), - tool_call_id="reply", - ), - } - return - if requests == 2: - followup.extend(messages) - yield { - 0: DeltaToolCall( - name=BandTool.SEND_MESSAGE, - json_args=json.dumps( - _reply_arguments(sample_message, "Recovered") - ), - tool_call_id="recovered", - ) - } - return - yield "" - - adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=batch)) - await adapter.on_started("Probe", "probe") - await _run_on_message(adapter, sample_message, tools) - - assert requests == 3 - assert shown in _tool_feedback(followup) - assert shown in _tool_feedback(adapter._message_history[tools.room_id]) - assert tools.chat == ["Recovered"] - assert reported_failures(tools) == [] - - @pytest.mark.asyncio - @pytest.mark.parametrize("cancel", [False, True], ids=["continue", "cancel"]) - async def test_concurrent_room_keeps_its_lifecycle( - self, sample_message: PlatformMessage, cancel: bool - ) -> None: - entered, release, cleaned = asyncio.Event(), asyncio.Event(), asyncio.Event() - - async def wait_for_work() -> str: - entered.set() - try: - await release.wait() - return "work completed" - finally: - cleaned.set() - - adapter = await _started_adapter(additional_tools=[wait_for_work]) - slow_tools, decline_tools = ( - FakeAgentTools(room_id="slow"), - FakeAgentTools(room_id="decline"), - ) - - async def slow_room() -> None: - with adapter._agent.override( - model=_streamed_tool_calls( - ("wait_for_work", {}), - ( - BandTool.SEND_MESSAGE, - _reply_arguments(sample_message, "Finished work"), - ), - ) - ): - await _run_on_message(adapter, sample_message, slow_tools) - - async with asyncio.TaskGroup() as group: - task = group.create_task(slow_room()) - try: - await entered.wait() - with adapter._agent.override(model=DecliningModel().model): - await _run_on_message(adapter, sample_message, decline_tools) - assert not task.done() - if cancel: - task.cancel() - finally: - release.set() - - assert cleaned.is_set() - assert task.cancelled() is cancel - assert slow_tools.chat == ([] if cancel else ["Finished work"]) - assert decline_tools.chat == [] - assert reported_failures(slow_tools) == reported_failures(decline_tools) == [] - - -def _reply_arguments(message: PlatformMessage, content: str) -> dict[str, Any]: - return {"content": content, "mentions": [message.sender_name]} - - -def _tool_feedback(messages: list[ModelMessage]) -> str: - """Tool results and retry prompts a later model request can read.""" - return "\n".join( - str(part.content) - for message in messages - for part in message.parts - if isinstance(part, ToolReturnPart | RetryPromptPart) - ) - - -def _history_tool_returns(messages: list[ModelMessage]) -> list[tuple[str, str, Any]]: - return [ - (part.tool_name, part.tool_call_id, part.content) - for message in messages - for part in message.parts - if isinstance(part, ToolReturnPart) - ] - - -def _emitted_tool_results(tools: FakeAgentTools) -> list[tuple[str, str, str]]: - results = [ - json.loads(event["content"]) - for event in events_of_type(tools, MessageType.TOOL_RESULT) - ] - return [ - ( - result[ToolEventKey.NAME], - result[ToolEventKey.OUTPUT], - result[ToolEventKey.TOOL_CALL_ID], - ) - for result in results - ] - - -def _assert_billed_responses( - tools: FakeAgentTools, messages: list[ModelMessage], *, model_requests: int = 1 -) -> None: - responses = [message for message in messages if isinstance(message, ModelResponse)] - assert len(responses) == model_requests - (payload,) = recorded_usage_payloads(tools) - assert ( - payload["input_tokens"] - == sum(response.usage.input_tokens for response in responses) - > 0 - ) - assert ( - payload["output_tokens"] - == sum(response.usage.output_tokens for response in responses) - > 0 - ) - - -async def _run_on_message( - adapter: PydanticAIAdapter, msg: PlatformMessage, tools: FakeAgentTools -) -> None: - await adapter.on_message( - msg=msg, - tools=tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id=tools.room_id, - ) - - -class TestNativeDiagnostics: - @pytest.mark.asyncio - async def test_initial_acknowledgement_then_decline_finishes_without_replay( - self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture - ) -> None: - requests = 0 - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[dict[int, DeltaToolCall]]: - nonlocal requests - requests += 1 - replying = requests == 1 - yield { - 0: DeltaToolCall( - name=BandTool.SEND_MESSAGE if replying else BandTool.NO_REPLY, - json_args=json.dumps( - _reply_arguments(sample_message, "Noted") - if replying - else {"reason": "Already acknowledged"} - ), - ) - } - - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - tools = FakeAgentTools(room_id=sample_message.room_id) - adapter = PydanticAIAdapter( - llm=FunctionModel(stream_function=stream), emit=Emit.USAGE - ) - await _run_on_message(adapter, sample_message, tools) - - assert requests == 2 - assert tools.chat == ["Noted"] - assert reported_failures(tools) == [] - assert "phase=run_completed" in caplog.text - _assert_billed_responses( - tools, adapter._message_history[tools.room_id], model_requests=2 - ) - - @pytest.mark.asyncio - async def test_streamed_tool_turn_keeps_effects_and_redacts_payloads( - self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture - ) -> None: - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - message = replace(sample_message, content="private prompt body") - tools = FakeAgentTools(room_id=message.room_id) - adapter = PydanticAIAdapter( - llm=_streamed_tool_calls( - ( - BandTool.SEND_MESSAGE, - {"content": "private tool body", "mentions": ["Alice"]}, - ) - ) - ) - - await _run_on_message(adapter, message, tools) - - tools.assert_message_sent(content="private tool body") - assert caplog.text.count("phase=request_attempt") == 2 - assert caplog.text.count("phase=response_ready") == 2 - assert "phase=tool_succeeded" in caplog.text - assert f"tool='{BandTool.SEND_MESSAGE}'" in caplog.text - assert f"room={message.room_id} message={message.id}" in caplog.text - assert ( - caplog.text.index("phase=result_received") - < caplog.text.index("phase=iterator_completed") - < caplog.text.index("phase=run_completed") - ) - assert "private prompt body" not in caplog.text - assert "private tool body" not in caplog.text - - @pytest.mark.asyncio - @pytest.mark.parametrize( - "yield_first", [False, True], ids=["before-first", "midstream"] - ) - async def test_stream_error_is_observed_and_preserves_exception( - self, - sample_message: PlatformMessage, - caplog: pytest.LogCaptureFixture, - yield_first: bool, - ) -> None: - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - failure = RuntimeError("private provider error body") - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str]: - if yield_first: - yield "private response body" - raise failure - - tools = FakeAgentTools(room_id=sample_message.room_id) - adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) - - with pytest.raises(RuntimeError) as raised: - await _run_on_message(adapter, sample_message, tools) - - assert raised.value is failure - assert "phase=run_error" in caplog.text - assert "error=RuntimeError" in caplog.text - assert "phase=response_ready" not in caplog.text - assert "phase=run_completed" not in caplog.text - assert "private provider error body" not in caplog.text - assert "private response body" not in caplog.text - assert len(failure_reports(tools)) == 1 - - @pytest.mark.asyncio - async def test_cancellation_closes_native_stream_without_reporting_failure( - self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture - ) -> None: - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - blocked = asyncio.Event() - closed = asyncio.Event() - release = asyncio.Event() - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str]: - try: - yield "private response body" - blocked.set() - await release.wait() - finally: - closed.set() - - tools = FakeAgentTools(room_id=sample_message.room_id) - adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) - async with asyncio.TaskGroup() as tasks: - task = tasks.create_task(_run_on_message(adapter, sample_message, tools)) - await asyncio.wait_for(blocked.wait(), timeout=5) - task.cancel() - - assert task.cancelled() - assert closed.is_set() - assert "phase=stream_progress" in caplog.text - assert "phase=run_cancelled" in caplog.text - assert "error=CancelledError" in caplog.text - assert "phase=response_ready" not in caplog.text - assert "phase=run_completed" not in caplog.text - assert "private response body" not in caplog.text - assert not failure_reports(tools) - - @pytest.mark.asyncio - async def test_long_stream_reports_bounded_progress( - self, sample_message: PlatformMessage, caplog: pytest.LogCaptureFixture - ) -> None: - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str]: - for _ in range(128): - yield "private token" - - adapter = PydanticAIAdapter(llm=FunctionModel(stream_function=stream)) - await _run_on_message( - adapter, sample_message, FakeAgentTools(room_id=sample_message.room_id) - ) - - assert 1 < caplog.text.count("phase=stream_progress") <= 9 - assert "phase=run_completed" in caplog.text - assert "private token" not in caplog.text - - def test_progress_lines_are_debug(self, caplog: pytest.LogCaptureFixture) -> None: - """Boundary traces stay off the default INFO log.""" - token = _native_turn.set(("room-1", "msg-1", 0.0)) - try: - caplog.set_level(logging.INFO, logger="band.adapters.pydantic_ai") - _log_native_progress("run_completed") - assert "phase=run_completed" not in caplog.text - caplog.set_level(logging.DEBUG, logger="band.adapters.pydantic_ai") - _log_native_progress("run_completed") - finally: - _native_turn.reset(token) - assert "phase=run_completed" in caplog.text - - -class TestAdvertisedToolSchemas: - """Per-argument text fidelity is asserted in test_tool_text_drift. - - What is pydantic-ai-specific, and checked here, is that the master model's - own description and provider-safe JSON schema reach the framework — nothing - is re-derived from a hand-written function signature any more. - """ - - @pytest.mark.asyncio - async def test_tool_blurb_is_the_master_docstring(self): - blurbs = { - name: schema.description - for name, schema in (await pydantic_ai_probe_tools()).items() - } - - assert blurbs, "no tools registered, so nothing was actually checked" - assert blurbs == {name: get_tool_description(name).strip() for name in blurbs} - - @pytest.mark.asyncio - async def test_advertised_schema_is_the_master_schema(self): - schemas = { - name: schema.json_schema - for name, schema in (await pydantic_ai_probe_tools()).items() - } - - assert schemas, "no tools registered, so nothing was actually checked" - assert schemas == { - name: sanitize_tool_schema( - platform_args_schema(name).model_json_schema(), - drop_numeric_bounds=True, - ) - for name in schemas - } - - @pytest.mark.asyncio - async def test_task_schemas_avoid_single_value_const(self): - """Task tools are the ones with a single-value ``Literal``. - - Pydantic renders that as ``const``, which some providers' restricted - JSON-Schema subsets reject; ``platform_args_schema`` normalizes it to a - one-member ``enum``, and this is the proof the sanitized schema — not a - raw ``model_json_schema()`` — is what gets advertised. - """ - adapter = await _started_adapter(capabilities=Capability.TASKS) - tools = adapter._agent._function_toolset.tools - - for name in TASK_TOOL_NAMES: - assert "const" not in json.dumps(tools[name].function_schema.json_schema) - - include = tools[BandTool.GET_TASK].function_schema.json_schema["properties"][ - "include" - ] - assert {"enum": ["history"], "type": "string"} in include["anyOf"] - - -class TestBuiltinToolRegistration: - """Exactly which built-in tools a set of features puts on the agent. - - Expectations are the registry's own name sets, so a newly added tool is - covered by whichever bucket it was declared in rather than by a literal - list someone has to remember to extend. - """ - - @pytest.mark.asyncio - async def test_default_features_register_only_chat_tools(self): - adapter = await _started_adapter() - - assert _registered_names(adapter) == CHAT_TOOL_NAMES - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("capabilities", "expected"), - [ - (Capability.CONTACTS, CHAT_TOOL_NAMES | CONTACT_TOOL_NAMES), - (Capability.MEMORY, CHAT_TOOL_NAMES | MEMORY_TOOL_NAMES), - (Capability.FILES, CHAT_TOOL_NAMES | FILE_TOOL_NAMES), - (Capability.TASKS, CHAT_TOOL_NAMES | TASK_TOOL_NAMES), - (ALL_CAPABILITIES, ALL_TOOL_NAMES), - ], - ids=["contacts", "memory", "files", "tasks", "all"], - ) - async def test_capability_selects_exact_tool_set(self, capabilities, expected): - adapter = await _started_adapter(capabilities=capabilities) - - assert _registered_names(adapter) == expected - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("feature_filter", "expected"), - [ - ({"include_tools": [BandTool.SEND_MESSAGE]}, {BandTool.SEND_MESSAGE}), - ( - {"exclude_tools": [BandTool.SEND_EVENT]}, - ALL_TOOL_NAMES - {BandTool.SEND_EVENT}, - ), - ({"include_categories": [ToolCategory.TASKS]}, TASK_TOOL_NAMES), - ], - ids=["include_tools", "exclude_tools", "include_categories"], - ) - async def test_feature_filters_narrow_the_capability_set( - self, feature_filter, expected - ): - adapter = await _started_adapter( - capabilities=ALL_CAPABILITIES, **feature_filter - ) - - assert _registered_names(adapter) == expected - - @pytest.mark.asyncio - async def test_filters_cannot_reintroduce_a_gated_tool(self): - """A filter narrows what the capabilities allow; it never widens it.""" - adapter = await _started_adapter(include_tools=[BandTool.STORE_MEMORY]) - - assert _registered_names(adapter) == set() - - -class TestBuiltinToolExecution: - """Argument handling through pydantic-ai's real tool-calling loop. - - The integration supplies pydantic-ai with the master schema and a validator - that preserves its normalized kwargs and retry behavior. - """ - - @pytest.mark.asyncio - async def test_invalid_arguments_retry_without_dispatching(self): - deps = MagicMock() - deps.send_message = AsyncMock(return_value={"status": "sent"}) - adapter = await _started_adapter() - - result = await _call_tool( - adapter, - deps, - BandTool.SEND_MESSAGE, - {"content": "hi", "mentions": "alice"}, - ) - - (retry,) = _parts(result, RetryPromptPart) - assert "Invalid arguments for band_send_message" in str(retry.content) - assert "mentions" in str(retry.content) - deps.send_message.assert_not_called() - - @pytest.mark.asyncio - async def test_unknown_arguments_retry_without_dispatching(self): - """The schema-driven tool boundary keeps native tools' extra rejection.""" - deps = MagicMock() - deps.send_message = AsyncMock(return_value={"status": "sent"}) - adapter = await _started_adapter() - - result = await _call_tool( - adapter, - deps, - BandTool.SEND_MESSAGE, - {"content": "hi", "mentions": [], "unexpected": "value"}, - ) - - (retry,) = _parts(result, RetryPromptPart) - assert "unexpected" in str(retry.content) - deps.send_message.assert_not_called() - - @pytest.mark.asyncio - @pytest.mark.parametrize( - "arguments", [["hi"], '"hi"', 123], ids=["list", "string", "number"] - ) - async def test_non_object_arguments_retry_without_dispatching(self, arguments): - """Valid JSON with a non-object shape is a model retry, not a crash.""" - deps = MagicMock() - deps.send_message = AsyncMock(return_value={"status": "sent"}) - adapter = await _started_adapter() - - result = await _call_tool( - adapter, - deps, - BandTool.SEND_MESSAGE, - arguments, - ) - - (_retry,) = _parts(result, RetryPromptPart) - deps.send_message.assert_not_called() - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("tool", "method_name", "expected_kwargs"), - [ - ( - BandTool.ADD_PARTICIPANT, - "add_participant", - {"identifier": "alice", "role": "member"}, - ), - ( - BandTool.REMOVE_PARTICIPANT, - "remove_participant", - {"identifier": "alice"}, - ), - ], - ids=["add_participant", "remove_participant"], - ) - async def test_validation_alias_argument_is_not_rejected_as_unknown( - self, tool, method_name, expected_kwargs - ): - """A field's ``validation_alias`` secondary name is a real accepted - argument, not an unrecognized one, even though it's absent from the - model's advertised JSON schema (which only lists the primary alias).""" - deps = MagicMock() - method = AsyncMock(return_value={"id": "user-1"}) - setattr(deps, method_name, method) - adapter = await _started_adapter() - - await _call_tool(adapter, deps, tool, {"name": "alice"}) - - method.assert_called_once_with(**expected_kwargs) - - @pytest.mark.asyncio - async def test_coercible_arguments_reach_the_dependency_normalized(self): - deps = MagicMock() - deps.list_tasks = AsyncMock(return_value={"tasks": []}) - adapter = await _started_adapter(capabilities=Capability.TASKS) - - await _call_tool(adapter, deps, BandTool.LIST_TASKS, {"limit": "5"}) - - # limit coerced to int; the two omitted optionals are not passed at all - # rather than handed over as None. - deps.list_tasks.assert_called_once_with(limit=5) - - @pytest.mark.asyncio - async def test_explicit_nulls_are_dropped_before_dispatch(self): - deps = MagicMock() - deps.send_event = AsyncMock(return_value={"status": "sent"}) - adapter = await _started_adapter() - - await _call_tool( - adapter, - deps, - BandTool.SEND_EVENT, - {"content": "thinking", "message_type": "thought", "metadata": None}, - ) - - deps.send_event.assert_called_once_with( - content="thinking", message_type="thought" - ) - - @pytest.mark.asyncio - async def test_dependency_is_called_with_master_field_names(self): - """The master model's field names are the dependency's keyword names. - - Keyword dispatch is what removes a whole class of bug the hand-written - wrappers had: ``send_room_file`` takes (content, filename, caption, - mentions) while the model lists them in another order. - """ - deps = MagicMock() - deps.send_room_file = AsyncMock(return_value={"message_id": "msg-1"}) - adapter = await _started_adapter(capabilities=Capability.FILES) - - await _call_tool( - adapter, - deps, - BandTool.SEND_ROOM_FILE, - { - "content": "file body", - "filename": "notes.txt", - "caption": "here's a file", - "mentions": ["Alice", "Bob"], - }, - ) - - deps.send_room_file.assert_called_once_with( - content="file body", - filename="notes.txt", - caption="here's a file", - mentions=["Alice", "Bob"], - ) - - @pytest.mark.asyncio - async def test_missing_backend_method_raises_an_actionable_error(self): - """A stale/typo'd registry method name is a registry bug -- it should - surface with the tool and method name, not a bare AttributeError.""" - deps = MagicMock(spec=[]) - adapter = await _started_adapter() - - with pytest.raises(RuntimeError, match="send_message"): - await _call_tool( - adapter, deps, BandTool.SEND_MESSAGE, {"content": "hi", "mentions": []} - ) - - -class TestBuiltinToolResults: - """What a finished built-in tool call hands back to the model.""" - - @pytest.mark.asyncio - async def test_add_participant_result_event_reads_as_plain_data(self): - """The tool_result event renders the result with str(), so a status - must read as its value, not as an enum member's repr.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test")) - await adapter.on_started("Probe", "probe") - adapter._agent.model = _streamed_tool_calls( - (BandTool.ADD_PARTICIPANT, {"identifier": "bob"}) - ) - tools = FakeAgentTools( - room_id=ROOM_ID, peers=[seeded_peer("bob-id", handle="bob", name="Bob")] - ) - - await adapter.on_event(turn_input(tools)) - - [event] = events_of_type(tools, MessageType.TOOL_RESULT) - output = json.loads(event["content"])[ToolEventKey.OUTPUT] - assert "'status': 'added'" in output - - @pytest.mark.asyncio - async def test_pydantic_results_are_serialized(self): - class Peer(BaseModel): - id: str - handle: str - - deps = MagicMock() - deps.lookup_peers = AsyncMock(return_value=Peer(id="p-1", handle="@ann")) - adapter = await _started_adapter() - - result = await _call_tool(adapter, deps, BandTool.LOOKUP_PEERS, {}) - - assert _tool_returns(result) == [{"id": "p-1", "handle": "@ann"}] - - @pytest.mark.asyncio - async def test_backend_failure_becomes_an_llm_readable_error(self): - deps = MagicMock() - deps.send_message = AsyncMock(side_effect=RuntimeError("backend down")) - adapter = await _started_adapter() - - result = await _call_tool( - adapter, deps, BandTool.SEND_MESSAGE, {"content": "hi", "mentions": []} - ) - - (content,) = _tool_returns(result) - assert "backend down" in content - # The wording is a contract with band_tool_errored, which the adapter - # reads to tell a failed Band tool from productive work. - assert band_tool_errored(BandTool.SEND_MESSAGE, content) - - @pytest.mark.asyncio - async def test_read_room_file_image_becomes_binary_content(self): - deps = MagicMock() - deps.read_room_file = AsyncMock( - return_value={ - "content": [ - {"type": "image", "data": "ZmFrZQ==", "mimeType": "image/png"} - ] - } - ) - adapter = await _started_adapter(capabilities=Capability.FILES) - - result = await _call_tool( - adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} - ) - - ((binary,),) = _tool_returns(result) - assert isinstance(binary, BinaryContent) - assert binary.data == b"fake" - assert binary.media_type == "image/png" - - @pytest.mark.asyncio - async def test_malformed_image_block_becomes_an_llm_readable_error(self): - """A block that fails to decode is a tool error, not a crashed run.""" - deps = MagicMock() - deps.read_room_file = AsyncMock( - return_value={ - "content": [ - { - "type": "image", - "data": "not-valid-base64!!", - "mimeType": "image/png", - } - ] - } - ) - adapter = await _started_adapter(capabilities=Capability.FILES) - - result = await _call_tool( - adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} - ) - - (content,) = _tool_returns(result) - assert band_tool_errored(BandTool.READ_ROOM_FILE, content) - - @pytest.mark.asyncio - async def test_non_image_file_result_passes_through(self): - deps = MagicMock() - deps.read_room_file = AsyncMock( - return_value={"name": "report.txt", "text": "hello world"} - ) - adapter = await _started_adapter(capabilities=Capability.FILES) - - result = await _call_tool( - adapter, deps, BandTool.READ_ROOM_FILE, {"file_id": "file-1"} - ) - - assert _tool_returns(result) == [{"name": "report.txt", "text": "hello world"}] - - @pytest.mark.asyncio - @pytest.mark.parametrize( - "room_event_error", - [None, RuntimeError("room offline")], - ids=["room_notified", "room_event_also_fails"], - ) - async def test_contact_request_failure_reaches_the_room(self, room_event_error): - """A contact request the agent failed to answer is invisible in the room - otherwise — it looks exactly like one that never arrived. Reporting it - is best-effort, so a failed room event must not change the tool's own - error output.""" - deps = MagicMock() - deps.respond_contact_request = AsyncMock(side_effect=RuntimeError("nope")) - deps.send_event = AsyncMock(side_effect=room_event_error) - adapter = await _started_adapter(capabilities=Capability.CONTACTS) - - result = await _call_tool( - adapter, - deps, - BandTool.RESPOND_CONTACT_REQUEST, - {"action": "approve", "handle": "@ann"}, - ) - - (content,) = _tool_returns(result) - assert "nope" in content - deps.send_event.assert_called_once_with(content, MessageType.ERROR) - - @pytest.mark.asyncio - async def test_contact_request_success_does_not_report_a_normalization_failure( - self, - ): - """A response that succeeded must not be reported to the room as - failed just because shaping its result afterward blew up.""" - deps = MagicMock() - approved = MagicMock() - approved.model_dump.side_effect = TypeError("boom during serialization") - deps.respond_contact_request = AsyncMock(return_value=approved) - deps.send_event = AsyncMock(return_value={"status": "sent"}) - adapter = await _started_adapter(capabilities=Capability.CONTACTS) - - result = await _call_tool( - adapter, - deps, - BandTool.RESPOND_CONTACT_REQUEST, - {"action": "approve", "handle": "@ann"}, - ) - - deps.respond_contact_request.assert_called_once_with( - action="approve", handle="@ann" - ) - (content,) = _tool_returns(result) - assert "boom during serialization" in content - deps.send_event.assert_not_called() - - @pytest.mark.asyncio - async def test_send_message_normalization_failure_counts_as_completed_work( - self, sample_message - ): - """A posted message is terminal even when its response cannot serialize.""" - calls_pending = True - - async def stream( - messages: list[ModelMessage], info: AgentInfo - ) -> AsyncIterator[str | dict[int, DeltaToolCall]]: - nonlocal calls_pending - if calls_pending: - calls_pending = False - yield { - 0: DeltaToolCall( - name=BandTool.SEND_MESSAGE, - json_args=json.dumps({"content": "hi", "mentions": []}), - tool_call_id="call-1", - ) - } - else: - yield "done" - - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="test"), emit=()) - await adapter.on_started("Probe", "probe") - adapter._agent.model = FunctionModel(stream_function=stream) - - deps = MagicMock() - result = MagicMock() - result.model_dump.side_effect = TypeError("boom during serialization") - deps.send_message = AsyncMock(return_value=result) - deps.send_event = AsyncMock() - - await adapter.on_message( - msg=sample_message, - tools=deps, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - deps.send_message.assert_called_once_with(content="hi", mentions=[]) - deps.send_event.assert_not_called() - - -class TestOnMessage: - """Tests for on_message() method.""" - - @pytest.mark.asyncio - async def test_initializes_history_on_bootstrap( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should initialize room history on first message.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - result_messages = [ModelRequest(parts=[UserPromptPart(content="test")])] - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=result_messages, - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - assert "room-123" in adapter._message_history - - @pytest.mark.asyncio - async def test_loads_existing_history( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should load historical messages on bootstrap.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - existing_history = [ - ModelRequest(parts=[UserPromptPart(content="[Bob]: Previous message")]), - ModelResponse(parts=[TextPart(content="Previous response")]), - ] - - result_messages = existing_history + [ - ModelRequest(parts=[UserPromptPart(content="new")]) - ] - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=result_messages, - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=existing_history, - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Verify history was passed to agent.run_stream_events() - call_kwargs = adapter._agent.run_stream_events.call_args.kwargs - assert "message_history" in call_kwargs - assert len(call_kwargs["message_history"]) == 2 - - @pytest.mark.asyncio - async def test_injects_participants_message( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should inject participants update when provided.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg="Alice joined the room", - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Check that participant message was added to history before run - call_kwargs = adapter._agent.run_stream_events.call_args.kwargs - message_history = call_kwargs.get("message_history", []) - # First message should be the participant update - if message_history: - first_msg = message_history[0] - assert isinstance(first_msg, ModelRequest) - assert "[System]: Alice joined" in first_msg.parts[0].content - - @pytest.mark.asyncio - async def test_creates_agent_lazily_if_not_started( - self, sample_message, mock_tools - ): - """Should create agent lazily if on_started wasn't called.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig( - model="openai:gpt-5.4", custom_section="Test section" - ) - ) - # Don't call on_started - set agent_name directly for prompt rendering - adapter.agent_name = "LazyBot" - - with patch.object(adapter, "_create_agent") as mock_create: - mock_agent = MagicMock() - mock_agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - mock_create.return_value = mock_agent - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - mock_create.assert_called_once() - - @pytest.mark.asyncio - async def test_a_turn_that_never_replied_is_reported_by_the_verdict( - self, mock_pydantic_agent - ): - """A clean run that never replied, declined or acted is a silently - dropped turn — the shared verdict reports it, even without an exception.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events(result_messages=[]) - ) - tools = FakeAgentTools(room_id=ROOM_ID) - - with pytest.raises(TurnResultAlreadyReported): - await adapter.on_event(turn_input(tools)) - - assert failure_reports(tools) == [MISSING_REPLY_FAILURE] - - -class TestOnCleanup: - """Tests for on_cleanup() method.""" - - @pytest.mark.asyncio - async def test_cleans_up_room_history(self): - """Should remove room history on cleanup.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - # Add some history - adapter._message_history["room-123"] = [ - ModelRequest(parts=[UserPromptPart(content="test")]) - ] - assert "room-123" in adapter._message_history - - await adapter.on_cleanup("room-123") - - assert "room-123" not in adapter._message_history - - -class TestHistoryManagement: - """Tests for message history management.""" - - @pytest.mark.asyncio - async def test_updates_history_after_run( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should update stored history with all messages from run.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - new_messages = [ - ModelRequest(parts=[UserPromptPart(content="Q1")]), - ModelResponse(parts=[TextPart(content="A1")]), - ] - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=new_messages, - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - assert adapter._message_history["room-123"] == new_messages - - @pytest.mark.asyncio - async def test_keeps_native_history_and_drops_content_null_responses( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should keep native tool history but drop responses that replay as null.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - user_request = ModelRequest(parts=[UserPromptPart(content="Q1")]) - tool_call_response = ModelResponse( - parts=[ - ToolCallPart( - tool_name="band_send_message", - args={"content": "A1", "mentions": ["Alice"]}, - tool_call_id="call_1", - ) - ] - ) - tool_return_request = ModelRequest( - parts=[ - ToolReturnPart( - tool_name="band_send_message", - content={"id": "msg_1"}, - tool_call_id="call_1", - ) - ] - ) - content_null_response = ModelResponse(parts=[]) - text_response = ModelResponse(parts=[TextPart(content="A1")]) - result_messages = [ - user_request, - tool_call_response, - tool_return_request, - content_null_response, - text_response, - ] - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=result_messages, - tool_results=[("band_send_message", {"id": "msg_1"}, "call_1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - stored_history = adapter._message_history["room-123"] - assert stored_history == [ - user_request, - tool_call_response, - tool_return_request, - text_response, - ] - assert content_null_response not in stored_history - - def test_keeps_response_with_only_native_tool_part(self): - """Native tool calls carry content the provider expects — keep them.""" - response = ModelResponse( - parts=[ - NativeToolCallPart( - tool_name="web_search", - args={"query": "weather"}, - tool_call_id="call_1", - ) - ] - ) - - assert _is_replayable_history_message(response) is True - - def test_history_processor_strips_content_null_responses(self): - """The processor drops empty/thinking-only responses, keeps real content. - - This runs before every model request (mid-run included), so an empty or - thinking-only response the model emits within a turn is never replayed as - assistant content:null — which providers reject. - """ - user_request = ModelRequest(parts=[UserPromptPart(content="Q1")]) - tool_call = ModelResponse( - parts=[ - ToolCallPart( - tool_name="band_send_message", - args={"content": "hi", "mentions": ["Alice"]}, - tool_call_id="call_1", - ) - ] - ) - tool_return = ModelRequest( - parts=[ - ToolReturnPart( - tool_name="band_send_message", - content={"id": "msg_1"}, - tool_call_id="call_1", - ) - ] - ) - empty_response = ModelResponse(parts=[]) - thinking_only = ModelResponse(parts=[ThinkingPart(content="hmm")]) - text_response = ModelResponse(parts=[TextPart(content="done")]) - - processed = _drop_non_replayable_messages( - [ - user_request, - tool_call, - tool_return, - empty_response, - thinking_only, - text_response, - ] - ) - - assert processed == [user_request, tool_call, tool_return, text_response] - assert empty_response not in processed - assert thinking_only not in processed - - @pytest.mark.asyncio - async def test_ensures_history_exists_for_non_bootstrap( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should create history if not bootstrap and room doesn't exist.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=False, # Not bootstrap - room_id="new-room", - ) - - # Should have created empty history - assert "new-room" in adapter._message_history - - -class TestExecutionReporting: - """Tests for execution reporting (tool_call and tool_result events).""" - - @pytest.mark.asyncio - async def test_emits_tool_call_events_when_enabled( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should emit tool_call events when emit=Emit.TOOL_CALLS.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], - tool_results=[("band_send_message", "Message sent", "call-123")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Verify send_event was called with tool_call - mock_tools.send_event.assert_any_call( - content='{"name": "band_send_message", "args": {"content": "Hello"}, "tool_call_id": "call-123"}', - message_type="tool_call", - ) - - @pytest.mark.asyncio - async def test_tool_call_event_redacts_send_room_file_content( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """band_send_room_file's content arg can carry up to - MAX_SEND_CONTENT_BYTES of real file bytes; the tool_call event must - report a bounded placeholder instead of the raw content.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_calls=[ - ( - "band_send_room_file", - {"content": "SECRET FILE BYTES", "filename": "f.txt"}, - "call-123", - ) - ], - tool_results=[("band_send_message", "Message sent", "call-2")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - reported_content = mock_tools.send_event.call_args_list[0].kwargs["content"] - assert "SECRET FILE BYTES" not in reported_content - assert "byte file content" in reported_content - assert '"filename": "f.txt"' in reported_content - - @pytest.mark.asyncio - async def test_emits_tool_result_events_when_enabled( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should emit tool_result events when emit=Emit.TOOL_CALLS.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_results=[ - ("band_send_message", "Message sent successfully", "call-123") - ], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Verify send_event was called with tool_result - mock_tools.send_event.assert_any_call( - content='{"name": "band_send_message", "output": "Message sent successfully", "tool_call_id": "call-123"}', - message_type="tool_result", - ) - - @pytest.mark.asyncio - async def test_tool_result_event_redacts_binary_content( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """band_read_room_file's image result is a list[BinaryContent]; str() - on that embeds the raw image bytes via BinaryContent.__repr__. The - tool_result event must report a bounded placeholder instead.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - image = BinaryContent( - data=b"\x89PNG\r\n\x1a\n" + b"\x00" * 64, media_type="image/png" - ) - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_results=[ - ("band_read_room_file", [image], "call-1"), - ("band_send_message", "Message sent", "call-2"), - ], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - mock_tools.send_event.assert_any_call( - content='{"name": "band_read_room_file", "output": "<1 image content block(s)>", "tool_call_id": "call-1"}', - message_type="tool_result", - ) - - @pytest.mark.asyncio - async def test_no_events_when_reporting_disabled( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """emit=() disables tool_call/tool_result events (emit otherwise defaults on).""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=() - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], - tool_results=[("band_send_message", "Message sent", "call-123")], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Verify send_event was NOT called for tool_call or tool_result - assert not set(message_types(mock_tools)) & {"tool_call", "tool_result"} - - @pytest.mark.asyncio - async def test_multiple_tool_calls_all_reported( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Should emit events for all tool calls in sequence.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[], - tool_calls=[ - ("band_lookup_peers", {}, "call-1"), - ("band_add_participant", {"identifier": "Helper"}, "call-2"), - ("band_send_message", {"content": "Done"}, "call-3"), - ], - tool_results=[ - ("band_lookup_peers", "[{...}]", "call-1"), - ("band_add_participant", "Added", "call-2"), - ("band_send_message", "Sent", "call-3"), - ], - ) - ) - - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Count tool_call and tool_result events - types = message_types(mock_tools) - assert types.count("tool_call") == 3 - assert types.count("tool_result") == 3 - - @pytest.mark.asyncio - async def test_event_failure_does_not_crash_run( - self, sample_message, mock_pydantic_agent - ): - """Should continue running if send_event fails.""" - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.TOOL_CALLS - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - # Mock tools where send_event fails with a real transport error — the - # tool_call event's own local guard swallows this and logs a warning; - # a generic Exception would be a bug and is intentionally left to - # propagate. - failing_tools = AsyncMock() - failing_tools.send_event = AsyncMock( - side_effect=httpx.ConnectError("Network error") - ) - - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=[ModelRequest(parts=[UserPromptPart(content="test")])], - tool_calls=[("band_send_message", {"content": "Hello"}, "call-123")], - tool_results=[("band_send_message", "Message sent", "call-123")], - ) - ) - - # Should not raise - await adapter.on_message( - msg=sample_message, - tools=failing_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # History should still be updated - assert "room-123" in adapter._message_history - - -def make_raising_stream( - error: BaseException, - *, - work: Callable[[], Awaitable[object]] | None = None, -): - """Run stream (async CM, as 2.x returns) that does ``work``, then raises. - - ``work`` stands in for the tool calls the run made through the room's - tools, so the turn's ledger sees exactly what those calls did. - """ - - async def stream(): - if work is not None: - await work() - raise error - yield # an async generator, like the real event stream - - @asynccontextmanager - async def events() -> AsyncIterator[AsyncIterator]: - yield stream() - - return events() - - -class TestEmptyFinalAnswer: - """A model can end a turn with output pydantic-ai cannot accept — blank text, - say — after the agent already replied/acted via tools, exhausting the refused - output-retry budget. That is benign — the work already went out — so it must not - fail the message, but a genuine no-work failure must still surface. - """ - - def test_swallow_matches_the_wording_pydantic_ai_actually_raises(self) -> None: - """The swallow keys on message text, since pydantic-ai exposes no code for it. - - Every other test here builds the exception by hand, so a reword upstream - would leave them green while the swallow quietly stopped matching — which is - exactly what 2.x did to the 1.x phrasing ("Exceeded maximum retries (N) for - output validation"). Read the real source so a future reword fails here. - """ - - source = Path(_tool_execution.__file__).read_text(encoding="utf-8").lower() - assert OUTPUT_RETRIES_EXHAUSTED in source - assert _is_output_retries_exhausted( - UnexpectedModelBehavior("Exceeded maximum output retries (3)") - ) - assert not _is_output_retries_exhausted( - UnexpectedModelBehavior("Invalid response, unable to find output") - ) - - @pytest.mark.asyncio - async def test_empty_output_after_tool_is_benign( - self, - sample_message, - mock_pydantic_agent, - caplog: pytest.LogCaptureFixture, - ): - """Output-retry exhaustion after the turn replied is swallowed.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - tools = FakeAgentTools(room_id="room-123") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - UnexpectedModelBehavior("Exceeded maximum output retries (1)"), - work=lambda: tools.send_message("hi", ["@Alice"]), - ) - ) - caplog.set_level(logging.WARNING, logger="band.adapters.pydantic_ai") - - # Must not raise: the reply already went out via the tool this turn. - await adapter.on_message( - msg=sample_message, - tools=tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - # Regression (fallback path): with the run mocked, capture_run_messages records - # nothing, so the swallow falls back to preserving at least the user prompt so - # the next same-session turn isn't amnesiac. - - preserved = adapter._message_history["room-123"] - assert preserved, "swallowed turn should still record the user message" - assert isinstance(preserved[-1], ModelRequest) - assert any( - isinstance(part, UserPromptPart) and "Hello, agent!" in str(part.content) - for part in preserved[-1].parts - ) - assert reported_failures(tools) == [] - assert "Exceeded maximum output retries (1)" in caplog.text - - @pytest.mark.asyncio - async def test_empty_output_preserves_full_captured_turn( - self, sample_message, mock_pydantic_agent - ): - """The swallow persists the whole captured turn — not just the user prompt — - so a later 'what did you just say?' has the agent's reply in context.""" - - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - tools = FakeAgentTools(room_id="room-xyz") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - UnexpectedModelBehavior("Exceeded maximum output retries (1)"), - work=lambda: tools.send_message("hi", ["@Alice"]), - ) - ) - - # pydantic-ai populates capture_run_messages during a real run; simulate a - # run that captured the full turn (user prompt + the agent's response). - full_turn = [ - ModelRequest(parts=[UserPromptPart(content="[Alice]: hi")]), - ModelResponse(parts=[TextPart(content="replied via tool")]), - ] - - @contextmanager - def fake_capture(): - yield full_turn - - with patch("band.adapters.pydantic_ai.capture_run_messages", fake_capture): - await adapter.on_message( - msg=sample_message, - tools=tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-xyz", - ) - - preserved = adapter._message_history["room-xyz"] - # The full turn is kept — crucially the assistant response, not only the user. - assert preserved == full_turn - assert any(isinstance(message, ModelResponse) for message in preserved) - - @pytest.mark.asyncio - async def test_empty_output_without_tool_propagates( - self, sample_message, mock_pydantic_agent - ): - """Same error with no tool executed is a real failure — propagate.""" - await self._assert_exhaustion_propagates( - sample_message, mock_pydantic_agent, work=None - ) - - @pytest.mark.asyncio - async def test_failed_run_still_emits_captured_usage( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """A run that raises still emits the usage its captured responses accrued. - - Tokens spent before the failure were still spent: the finally-based emit - falls back to summing this run's captured ModelResponses when no result - event fired, so a hard mid-run failure doesn't silently drop usage.""" - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), emit=Emit.USAGE - ) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - UnexpectedModelBehavior("Invalid response, unable to find output"), - ) - ) - - # Simulate a run that captured a response with usage before raising. - captured_turn = [ - ModelRequest(parts=[UserPromptPart(content="[Alice]: hi")]), - make_usage_response(100, 20, parts=[TextPart(content="partial")]), - ] - - @contextmanager - def fake_capture(): - yield captured_turn - - with ( - patch("band.adapters.pydantic_ai.capture_run_messages", fake_capture), - pytest.raises(UnexpectedModelBehavior), - ): - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - usage_payloads = sent_usage_payloads(mock_tools) - assert usage_payloads == [ - { - "input_tokens": 100, - "output_tokens": 20, - "cache_read_tokens": 0, - "cache_write_tokens": 0, - } - ], f"expected the captured run's usage to be emitted, got {usage_payloads}" - - @pytest.mark.asyncio - async def test_unrelated_model_error_propagates_even_after_tool( - self, sample_message, mock_pydantic_agent - ): - """The swallow is narrow: other model errors still surface after a reply.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - tools = FakeAgentTools(room_id="room-123") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - UnexpectedModelBehavior("Invalid response, unable to find output"), - work=lambda: tools.send_message("hi", ["@Alice"]), - ) - ) - - with pytest.raises(UnexpectedModelBehavior): - await _run_on_message(adapter, sample_message, tools) - - assert failure_reports(tools) == [ - ("pydantic_ai", GENERIC_PROVIDER_FAILURE_MESSAGE) - ] - - @pytest.mark.asyncio - async def test_generic_provider_error_reports_and_propagates( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """A failure that isn't UnexpectedModelBehavior at all (a raw provider/API - error) must still surface as a failure and propagate, not vanish uncaught.""" - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - RuntimeError("provider connection reset"), - ) - ) - - with pytest.raises(RuntimeError, match="provider connection reset"): - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - mock_tools.send_failure.assert_awaited_once() - failure = mock_tools.send_failure.call_args.args[0] - assert failure.provider == "pydantic_ai" - assert failure.message == GENERIC_PROVIDER_FAILURE_MESSAGE - - @pytest.mark.asyncio - async def test_empty_output_after_read_only_tool_propagates( - self, sample_message, mock_pydantic_agent - ): - """A read-only lookup is not terminal work — output-validation exhaustion - after only a lookup is a genuine no-response failure and must propagate.""" - tools = FakeAgentTools(room_id="room-123") - - await self._assert_exhaustion_propagates( - sample_message, mock_pydantic_agent, tools=tools, work=tools.lookup_peers - ) - - @pytest.mark.asyncio - async def test_empty_output_after_failed_band_tool_propagates( - self, sample_message, mock_pydantic_agent - ): - """A band tool that raised did no work — exhausting output validation - afterward is a genuine failure and must propagate.""" - tools = FakeAgentTools(room_id="room-123") - - async def rejected_send() -> None: - # The band tool wrapper turns this raise into an error string for - # the model; the turn records nothing either way. - with contextlib.suppress(BandToolError): - await tools.send_message("hi", mentions=[]) - - await self._assert_exhaustion_propagates( - sample_message, mock_pydantic_agent, tools=tools, work=rejected_send - ) - - @staticmethod - async def _assert_exhaustion_propagates( - sample_message: PlatformMessage, - mock_pydantic_agent: MagicMock, - *, - work: Callable[[], Awaitable[object]] | None, - tools: FakeAgentTools | None = None, - ) -> None: - """Output-retry exhaustion after ``work`` fails the turn as a provider error.""" - tools = tools or FakeAgentTools(room_id="room-123") - adapter = PydanticAIAdapter(PydanticAIAdapterConfig(model="openai:gpt-5.4")) - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - adapter._agent.run_stream_events = MagicMock( - return_value=make_raising_stream( - UnexpectedModelBehavior("Exceeded maximum output retries (1)"), - work=work, - ) - ) - - with pytest.raises(UnexpectedModelBehavior): - await _run_on_message(adapter, sample_message, tools) - - assert failure_reports(tools) == [ - ("pydantic_ai", GENERIC_PROVIDER_FAILURE_MESSAGE) - ] - - -class TestCustomTools: - """Tests for custom tool support (PydanticAI-native functions).""" - - @pytest.mark.asyncio - @pytest.mark.parametrize( - ("declared", "reported"), [(True, []), (False, [MISSING_REPLY_FAILURE])] - ) - async def test_native_tool_counts_only_the_effect_it_declared( - self, declared: bool, reported: list - ): - """A native tool runs outside the portable custom-tool path, so its - declared effect still has to reach the turn; an undeclared one only - observes.""" - - async def finish(ctx: RunContext[AgentToolsProtocol], note: str) -> str: - """Finish the task.""" - return "done" - - if declared: - declares_turn_effect(TurnEffect.ACT)(finish) - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="test"), additional_tools=[finish] - ) - await adapter.on_started("Probe", "probe") - adapter._agent.model = _streamed_tool_calls(("finish", {"note": "go"})) - tools = FakeAgentTools(room_id=ROOM_ID) - - with contextlib.suppress(TurnResultAlreadyReported): - await adapter.on_event(turn_input(tools)) - - assert failure_reports(tools) == reported - - @pytest.mark.asyncio - async def test_a_native_tool_failure_value_leaves_the_turn_unanswered(self) -> None: - @declares_turn_effect(TurnEffect.ACT) - async def finish( - ctx: RunContext[AgentToolsProtocol], note: str - ) -> dict[str, Any]: - """Finish the task.""" - return {"ok": False, "error": "upstream refused"} - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="test"), additional_tools=[finish] - ) - await adapter.on_started("Probe", "probe") - adapter._agent.model = _streamed_tool_calls(("finish", {"note": "go"})) - tools = FakeAgentTools(room_id=ROOM_ID) - - with pytest.raises(TurnResultAlreadyReported): - await adapter.on_event(turn_input(tools)) - - assert failure_reports(tools) == [MISSING_REPLY_FAILURE] - - def test_accepts_additional_tools_parameter(self): - """Adapter accepts list of callables.""" - - async def my_tool(ctx: RunContext[AgentToolsProtocol], message: str) -> str: - """A custom tool.""" - return f"Echo: {message}" - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), additional_tools=[my_tool] - ) - - assert len(adapter._custom_tools) == 1 - assert adapter._custom_tools[0] == my_tool - - def test_multiple_custom_tools(self): - """Should accept multiple custom tools.""" - - async def tool_one(ctx: RunContext[AgentToolsProtocol], a: int) -> int: - """Tool one.""" - return a + 1 - - def tool_two(ctx: RunContext[AgentToolsProtocol], b: str) -> str: - """Tool two.""" - return b.upper() - - async def tool_three( - ctx: RunContext[AgentToolsProtocol], x: float, y: float - ) -> float: - """Tool three.""" - return x + y - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), - additional_tools=[tool_one, tool_two, tool_three], - ) - - assert len(adapter._custom_tools) == 3 - - @pytest.mark.asyncio - async def test_registers_custom_tools_with_agent(self): - """Custom tools should be registered via agent.tool().""" - - async def my_echo(ctx: RunContext[AgentToolsProtocol], message: str) -> str: - """Echo the message.""" - return f"Echo: {message}" - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="test"), additional_tools=[my_echo] - ) - - # Mock the Agent class to track tool registrations - registered_tools = [] - - with patch("band.adapters.pydantic_ai.Agent") as MockAgent: - mock_agent = MagicMock() - mock_agent.tool = MagicMock( - side_effect=lambda f: registered_tools.append(f) - ) - MockAgent.return_value = mock_agent - - await adapter.on_started("TestBot", "Test bot") - - # Should have registered platform tools + custom tool - tool_names = [t.__name__ for t in registered_tools] - assert "my_echo" in tool_names - - @pytest.mark.asyncio - async def test_custom_tool_appears_in_agent_function_tools( - self, mock_pydantic_agent - ): - """Custom tool should appear in agent._function_tools after registration.""" - - async def calculator( - ctx: RunContext[AgentToolsProtocol], a: float, b: float - ) -> float: - """Add two numbers.""" - return a + b - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), - additional_tools=[calculator], - ) - - # Add calculator to mock agent's function tools when tool() is called - def register_tool(func): - mock_pydantic_agent._function_tools[func.__name__] = MagicMock( - name=func.__name__ - ) - - mock_pydantic_agent.tool = MagicMock(side_effect=register_tool) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - # Manually call tool registration since we're mocking _create_agent - for custom_tool in adapter._custom_tools: - mock_pydantic_agent.tool(custom_tool) - - assert "calculator" in mock_pydantic_agent._function_tools - - @pytest.mark.asyncio - async def test_custom_tools_work_with_on_message( - self, sample_message, mock_tools, mock_pydantic_agent - ): - """Custom tools should work during message handling.""" - - async def my_helper(ctx: RunContext[AgentToolsProtocol], value: str) -> str: - """Helper tool.""" - return f"Helped: {value}" - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), - additional_tools=[my_helper], - ) - - with patch.object(adapter, "_create_agent", return_value=mock_pydantic_agent): - await adapter.on_started("TestBot", "Test bot") - - result_messages = [ModelRequest(parts=[UserPromptPart(content="test")])] - adapter._agent.run_stream_events = MagicMock( - return_value=make_stream_events( - result_messages=result_messages, - tool_results=[("band_send_message", "Message sent", "call-1")], - ) - ) - - # Should not raise - await adapter.on_message( - msg=sample_message, - tools=mock_tools, - history=[], - participants_msg=None, - contacts_msg=None, - is_session_bootstrap=True, - room_id="room-123", - ) - - assert "room-123" in adapter._message_history - - -def _portable_tool_agent( - tool_def: CustomToolDef, -) -> Agent[AgentToolsProtocol, str]: - """A bare agent running one converted ``CustomToolDef`` on pydantic-ai's own path.""" - agent = Agent(TestModel(), deps_type=AgentToolsProtocol, output_type=str) - agent.tool(_custom_tool_def_to_callable(tool_def)) - return agent - - -async def _run_portable_tool( - tool_def: CustomToolDef, tools: FakeAgentTools | None = None -) -> list[Any]: - """Run one converted ``CustomToolDef`` in a room; return what the model saw.""" - result = await _portable_tool_agent(tool_def).run( - "go", deps=tools or FakeAgentTools() - ) - return _tool_returns(result) - - -class TestPortableCustomToolDef: - """pydantic accepts the portable CustomToolDef (InputModel, handler) tuple form — - the same custom-tool shape anthropic/crewai/claude_sdk/langgraph take.""" - - @pytest.mark.asyncio - async def test_tuple_is_normalized_to_a_named_callable(self): - - class LookupInput(BaseModel): - """look up a code.""" - - key: str - - def lookup(args: LookupInput) -> str: - return f"code:{args.key}" - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="openai:gpt-5.4"), - additional_tools=[(LookupInput, lookup)], - ) - # Normalized to a native callable named from the model (not the handler). - assert [t.__name__ for t in adapter._custom_tools] == ["lookup"] - - def test_converted_tuple_flattens_in_pydantic_ai(self): - - class LookupInput(BaseModel): - """look up a code.""" - - key: str - - def lookup(args: LookupInput) -> str: - return f"code:{args.key}" - - (tool,) = _portable_tool_agent( - (LookupInput, lookup) - )._function_toolset.tools.values() - schema = tool.function_schema.json_schema - # pydantic-ai flattens the single model param into the tool's args. - assert tool.name == "lookup" - assert sorted((schema.get("properties") or {}).keys()) == ["key"] - - @pytest.mark.asyncio - async def test_async_handler_tuple_is_awaited_end_to_end(self): - """An async CustomToolDef handler returns its awaited value through a real - pydantic-ai run — not an unawaited coroutine (which the previous sync - passthrough produced, failing serialization).""" - - class LookupInput(BaseModel): - """look up a code.""" - - key: str - - async def lookup(args: LookupInput) -> str: - return f"code:{args.key}" - - (content,) = await _run_portable_tool((LookupInput, lookup)) - assert isinstance(content, str) - assert content.startswith("code:") - - @pytest.mark.asyncio - async def test_zero_arg_handler_tuple_runs_end_to_end(self): - """A zero-argument handler with an empty InputModel executes through a real - pydantic-ai run — the previous sync passthrough called it with one - positional arg and raised TypeError.""" - - class PingInput(BaseModel): - """ping.""" - - def ping() -> str: - return "pong" - - assert await _run_portable_tool((PingInput, ping)) == ["pong"] - - @pytest.mark.asyncio - async def test_aliased_input_model_runs_end_to_end(self): - """An InputModel using a field alias executes through a real pydantic-ai - run — a dump/re-validate round-trip would emit field names and fail - re-validation against the alias-only model.""" - - class AliasedInput(BaseModel): - """look up a user.""" - - user_id: str = Field(alias="userId") - - def lookup(args: AliasedInput) -> str: - return f"user:{args.user_id}" - - (content,) = await _run_portable_tool((AliasedInput, lookup)) - assert isinstance(content, str) - assert content.startswith("user:") - - @pytest.mark.asyncio - @pytest.mark.parametrize(("declare", "complete"), CUSTOM_TOOL_DECLARATIONS) - async def test_custom_tool_records_its_effect_on_the_room_turn( - self, declare: Callable[..., Any], complete: bool - ): - class FileInput(BaseModel): - """File the report.""" - - note: str - - @declare - def file_report(args: FileInput) -> str: - return "filed" - - tools = FakeAgentTools() - adapter = PydanticAIAdapter( - llm=_scripted_tool_calls(("file", {"note": "go"})), - additional_tools=[(FileInput, file_report)], - ) - adapter.agent_name = "TestBot" - - await adapter._create_agent().run("go", deps=tools) - - assert tools.turn.complete is complete +__all__ = [ + "instrument_all_restored", + "mock_pydantic_agent", + "mock_tools", + "sample_message", + "trace_capture", +] diff --git a/tests/e2e/baseline/README.md b/tests/e2e/baseline/README.md index e7569d5dd..420f82bbd 100644 --- a/tests/e2e/baseline/README.md +++ b/tests/e2e/baseline/README.md @@ -239,7 +239,7 @@ These three are why the toolkit is shaped the way it is — keep them when exten | `smoke/matrix/` | runs across the adapter matrix: `test_adapter_matrix.py`, `test_capability_matrix.py` (memory store + recall), `test_context_recall.py` (in-session + rejoin), `test_rehydration_offline.py` / `test_rehydration_partial.py` (cold-boot / partial-reboot `/context` recall), `test_rehydration_cross_framework.py` (a different-framework `peer=` authors, A rehydrates), `test_room_isolation.py`, `test_noisy_room.py`, `test_tool_round_trip.py` (custom-tool subgroup) | | `smoke/behavior/` | platform/transport + scenario behavior: `test_delivery_status.py`, `test_processing_barrier.py`, `test_isolation.py`, `test_duplicate_start.py` (the platform refuses a second start of a live agent id under `ConflictPolicy.REJECT`), `test_room_rejoin.py` (a Codex, Claude SDK or ACP agent removed from a room and re-added answers again), `test_agent_scenarios.py`, `test_approvals.py` (chat-mediated approve/decline/timeout for every coding agent; builds via `smoke/samples/approvals.py`) | | `smoke/inspection/` | `capture.*` observation worked-examples: `test_tool_calls.py`, `test_events.py`, `test_memory.py`, `test_usage.py` (the `Emit.USAGE` fan), plus `test_next_actionable_semantics.py` (a platform `/next` invariant, `@lane`-pinned since it runs no adapter) | -| `smoke/adapters/` | adapter-specific showcases: `test_a2a.py`, `test_a2a_gateway.py`, `test_a2a_roundtrip.py` (+ their shared `a2aServer.py` fixture -- a scripted, non-Band A2A counterparty), `test_agno.py`, `test_copilot_acp.py`, `test_copilot_sdk.py`, `test_crewai.py`, `test_letta.py`, `test_parlant.py` | +| `smoke/adapters/` | adapter-specific showcases: `test_a2a.py`, `test_a2a_gateway.py`, `test_a2a_roundtrip.py` (+ their shared `a2aServer.py` fixture -- a scripted, non-Band A2A counterparty), `test_agno.py`, `test_copilot_acp.py`, `copilotsdk/`, `test_crewai.py`, `test_letta.py`, `test_parlant.py` | The `toolkit/` modules are pytest-free and reusable anywhere. The package root (`settings`, `requires`, `agents`, `conftest`) is the pytest wiring. @@ -574,6 +574,8 @@ the `dev` extra but are split out for isolation. | Lane | `uv` extra | Adapters | Backend the CI job provides | |------|-----------|----------|------------------------------| +| `strands` | `dev-strands-nooa` | strands | OpenAI key; LangGraph foreign peer installed; Ubuntu and Windows | +| `nooa` | `dev-strands-nooa` | nooa | Anthropic key; Python 3.12–3.13 on POSIX; Linux-only E2E lane | | `core` | `dev` | anthropic, claude_sdk, agno, langgraph, pydantic_ai, copilot_sdk | provider keys (secrets); copilot_sdk self-downloads its CLI runtime and uses Anthropic BYOK without GitHub auth | | `crewai` | `dev-crewai` | crewai, crewai_flow | provider keys; isolated venv (crewai conflicts with `dev`'s deps — `pyproject.toml [tool.uv] conflicts`) | | `google` | `dev` | gemini, google_adk | provider keys; split from `core` so Google free-tier rate-limit flakiness is isolated | @@ -616,7 +618,9 @@ fail-loud. **Home ≠ hosting.** An adapter's *home* lane is where its single-framework cells run; *hosting* is which lanes' `uv` extra can actually install a framework (`hosting_lanes` in `toolkit/ci_lanes.py`: every `dev` lane hosts every `dev` framework; `dev-crewai` -hosts only the crewai stack). A test whose frameworks share one home lane runs there. +hosts only the crewai stack. `dev-strands-nooa` hosts Strands, NOOA on supported +platforms, and the explicitly declared LangGraph peer; it does not host other +core adapters. Strands and NOOA share dependencies but own separate E2E lanes). A test whose frameworks share one home lane runs there. A test whose frameworks span **more than one** home lane is hosted by no single job by default, so `assert_every_item_is_schedulable` (the same hook) **fails collection** for it — the fail-loud guard against a test that would silently skip in every lane (false @@ -695,10 +699,11 @@ nodeid. Excluded adapters get explicit N/A rows. active cell, or failure reddens the gate. The manifest lists supported OSes for each lane and explicit N/A reasons for environment-gated file cells. - **Update the manifest when intentional coverage changes.** Collect the default - extra, then union Parlant's structurally separate extra: + extra, then collect legacy and union Parlant's structurally separate extra: ```bash uv run python -m tests.e2e.baseline.scorecard manifest + uv run --locked --isolated --python 3.12 --extra dev-strands-nooa --all-packages python -m tests.e2e.baseline.scorecard manifest --merge-existing uv run --isolated --python 3.12 --extra dev-parlant --all-packages python -m tests.e2e.baseline.scorecard manifest --merge-existing ``` @@ -885,3 +890,21 @@ workflow emits no `letta × windows` cell — every other lane runs on both OSes `e2e_pending` (which once excluded Letta) is now a reason *string* (`str | None`), pinned to an allowlist — empty today — in `tests/framework_conformance/test_agent_wiring_rules.py`. + + +### Legacy OpenAI environments + +Run Strands and NOOA separately, using the same isolated dependency extra: + +```bash +E2E_TESTS_ENABLED=true BAND_E2E_LANE=strands uv run --locked --isolated --python 3.12 --all-packages --extra dev-strands-nooa pytest tests/e2e/baseline/ -v -s --no-cov -p no:rerunfailures +E2E_TESTS_ENABLED=true BAND_E2E_LANE=nooa uv run --locked --isolated --python 3.12 --all-packages --extra dev-strands-nooa pytest tests/e2e/baseline/ -v -s --no-cov -p no:rerunfailures +``` + +NOOA remains POSIX-only on Python 3.12–3.13; its CI E2E lane is Linux-only. +Strands runs on both CI operating systems. Core tests retain exact collection +of lazy legacy matrix cells even though those cells execute in their own lanes. +Only modules absent at import time (such as Parlant) need a manifest union. +The legacy cross-framework wrapper assigns Strands + LangGraph to the Strands +lane; `@per_adapter(lane=...)` filters adapter selection and `@lane(...)` assigns +execution. These are separate decisions. diff --git a/tests/e2e/baseline/agents.py b/tests/e2e/baseline/agents.py index 88f3228f4..65c756e53 100644 --- a/tests/e2e/baseline/agents.py +++ b/tests/e2e/baseline/agents.py @@ -78,7 +78,7 @@ def lane(lane_id: Lane) -> pytest.MarkDecorator: * a multi-framework test whose frameworks live in different home lanes (otherwise a collection error): names the one lane whose ``uv`` extra hosts all of them; * a *bespoke* smoke that builds its adapter by hand and requests no ``agent`` fixture - (e.g. ``smoke/adapters/test_copilot_sdk.py``, ``test_parlant.py``): it exposes no + (e.g. ``smoke/adapters/copilotsdk/``, ``test_parlant.py``): it exposes no framework to the selector, so absent this pin it would run in *every* lane. Here ``@with_adapters`` is not an option — the wiring guard requires it to provision. """ diff --git a/tests/e2e/baseline/conftest.py b/tests/e2e/baseline/conftest.py index 09084ecbc..9a93daad6 100644 --- a/tests/e2e/baseline/conftest.py +++ b/tests/e2e/baseline/conftest.py @@ -28,6 +28,7 @@ peer, ) from tests.e2e.baseline.fixtures.capture import judge, reply_capture +from tests.e2e.baseline.fixtures.diagnostics import diagnostic_logs from tests.e2e.baseline.fixtures.platform import ( baseline_run_id, baseline_settings, @@ -59,6 +60,7 @@ "baseline_user_client", "baseline_ws", "cell", + "diagnostic_logs", "judge", "orphan_sweep", "peer", diff --git a/tests/e2e/baseline/expected-cells.json b/tests/e2e/baseline/expected-cells.json index 3e3780722..0346342db 100644 --- a/tests/e2e/baseline/expected-cells.json +++ b/tests/e2e/baseline/expected-cells.json @@ -25,6 +25,10 @@ "parlant": [ "ubuntu", "windows" + ], + "strands": [ + "ubuntu", + "windows" ] }, "cells": [ @@ -38,7 +42,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -53,7 +58,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -68,7 +74,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -83,7 +90,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -98,7 +106,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -113,7 +122,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -128,7 +138,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -143,7 +154,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -158,7 +170,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -173,7 +186,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -188,7 +202,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -203,7 +218,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -218,7 +234,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -233,7 +250,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -248,7 +266,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -263,7 +282,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -278,7 +298,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -293,7 +314,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -308,7 +330,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -323,7 +346,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -338,7 +362,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -353,7 +378,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -368,7 +394,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -383,7 +410,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -398,7 +426,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -413,7 +442,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -428,7 +458,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -443,7 +474,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -458,7 +490,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -473,7 +506,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -488,7 +522,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -503,7 +538,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -518,16 +554,17 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/guards/test_strands_provider.py::test_strands_builder_executes_a_responses_tool_once", + "test": "tests/e2e/baseline/guards/test_strands_provider.py::TestStrandsProvider::test_strands_builder_executes_a_responses_tool_once", "adapter": "suite", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -542,7 +579,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -557,7 +595,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -572,7 +611,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -587,7 +627,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -602,7 +643,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -617,7 +659,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -632,7 +675,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -647,13 +691,14 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_a2a.py::test_a2a_adapter_relays_a_real_counterparty_reply", + "test": "tests/e2e/baseline/smoke/adapters/copilotsdk/test_handler.py::TestAskUserHandler::test_copilot_ask_user_handler_round_trips_to_room_reply", "adapter": "suite", "lanes": [ "core" @@ -662,7 +707,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_a2a.py::test_a2a_adapter_surfaces_a_remote_task_failure", + "test": "tests/e2e/baseline/smoke/adapters/copilotsdk/test_resume.py::TestResumeMiss::test_copilot_recall_via_injected_history_when_resume_misses", "adapter": "suite", "lanes": [ "core" @@ -671,7 +716,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_a2a_gateway.py::test_gateway_serves_a_real_a2a_client", + "test": "tests/e2e/baseline/smoke/adapters/copilotsdk/test_roomquestion.py::TestRoomQuestion::test_copilot_ask_user_room_question_answered_by_next_message", "adapter": "suite", "lanes": [ "core" @@ -680,7 +725,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_a2a_roundtrip.py::test_band_to_band_round_trip_over_real_a2a", + "test": "tests/e2e/baseline/smoke/adapters/copilotsdk/test_sharedclient.py::TestSharedClient::test_copilot_shared_client_across_adapter_lifecycles", "adapter": "suite", "lanes": [ "core" @@ -689,7 +734,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_agno.py::test_agno_executes_native_tool", + "test": "tests/e2e/baseline/smoke/adapters/test_a2a.py::test_a2a_adapter_relays_a_real_counterparty_reply", "adapter": "suite", "lanes": [ "core" @@ -698,7 +743,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_agno.py::test_agno_handles_multiple_native_tools", + "test": "tests/e2e/baseline/smoke/adapters/test_a2a.py::test_a2a_adapter_surfaces_a_remote_task_failure", "adapter": "suite", "lanes": [ "core" @@ -707,43 +752,43 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_shell_approval_is_required[approve]", + "test": "tests/e2e/baseline/smoke/adapters/test_a2a_gateway.py::test_gateway_serves_a_real_a2a_client", "adapter": "suite", "lanes": [ - "backends" + "core" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_shell_approval_is_required[decline]", + "test": "tests/e2e/baseline/smoke/adapters/test_a2a_roundtrip.py::test_band_to_band_round_trip_over_real_a2a", "adapter": "suite", "lanes": [ - "backends" + "core" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_thoughts_are_not_placeholders", + "test": "tests/e2e/baseline/smoke/adapters/test_agno.py::test_agno_executes_native_tool", "adapter": "suite", "lanes": [ - "backends" + "core" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_band_tool_call_is_narrated", + "test": "tests/e2e/baseline/smoke/adapters/test_agno.py::test_agno_handles_multiple_native_tools", "adapter": "suite", "lanes": [ - "backends" + "core" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_band_tool_result_is_a_single_clean_payload", + "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_shell_approval_is_required[approve]", "adapter": "suite", "lanes": [ "backends" @@ -752,7 +797,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_recall_via_room_replay_when_session_load_misses", + "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_shell_approval_is_required[decline]", "adapter": "suite", "lanes": [ "backends" @@ -761,7 +806,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_hosted_auth_replies[default]", + "test": "tests/e2e/baseline/smoke/adapters/test_codex.py::test_codex_thoughts_are_not_placeholders", "adapter": "suite", "lanes": [ "backends" @@ -770,7 +815,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_hosted_auth_replies[typed-effort]", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_band_tool_call_is_narrated", "adapter": "suite", "lanes": [ "backends" @@ -779,7 +824,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_switches_model_and_effort_in_a_live_room", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_band_tool_result_is_a_single_clean_payload", "adapter": "suite", "lanes": [ "backends" @@ -788,7 +833,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_turn_fails_loudly_on_an_unadvertised_selection[byok-model]", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_acp_recall_via_room_replay_when_session_load_misses", "adapter": "suite", "lanes": [ "backends" @@ -797,7 +842,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_turn_fails_loudly_on_an_unadvertised_selection[hosted-effort]", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_hosted_auth_replies[default]", "adapter": "suite", "lanes": [ "backends" @@ -806,37 +851,37 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py::test_copilot_ask_user_handler_round_trips_to_room_reply", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_hosted_auth_replies[typed-effort]", "adapter": "suite", "lanes": [ - "core" + "backends" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py::test_copilot_ask_user_room_question_answered_by_next_message", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_switches_model_and_effort_in_a_live_room", "adapter": "suite", "lanes": [ - "core" + "backends" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py::test_copilot_recall_via_injected_history_when_resume_misses", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_turn_fails_loudly_on_an_unadvertised_selection[byok-model]", "adapter": "suite", "lanes": [ - "core" + "backends" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py::test_copilot_shared_client_across_adapter_lifecycles", + "test": "tests/e2e/baseline/smoke/adapters/test_copilot_acp.py::test_copilot_turn_fails_loudly_on_an_unadvertised_selection[hosted-effort]", "adapter": "suite", "lanes": [ - "core" + "backends" ], "status": "pass", "reason": null @@ -1238,7 +1283,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -1289,7 +1335,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -1520,7 +1567,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -1535,7 +1583,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "pass", "reason": null @@ -1712,7 +1761,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -1736,7 +1786,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "deferred: cumulative-lifetime counter, not per-turn" @@ -1751,7 +1802,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "usage lives in user-supplied flow internals" @@ -1766,7 +1818,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -1826,7 +1879,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -1853,7 +1907,7 @@ "test": "tests/e2e/baseline/smoke/inspection/test_usage.py::test_usage_not_cumulative_across_turns", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -1904,7 +1958,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -1928,7 +1983,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "deferred: cumulative-lifetime counter, not per-turn" @@ -1943,7 +1999,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "usage lives in user-supplied flow internals" @@ -1958,7 +2015,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -2018,7 +2076,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -2045,7 +2104,7 @@ "test": "tests/e2e/baseline/smoke/inspection/test_usage.py::test_usage_recorded_for_a_turn", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -2207,7 +2266,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_adapter_matrix.py::test_build_adapter_constructs_each", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -2369,7 +2428,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_adapter_matrix.py::test_per_adapter_replies", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -2447,7 +2506,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot span-recall an early fact" @@ -2537,7 +2597,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_burst_recall.py::test_burst_handled_then_spanning_recall", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -2552,7 +2612,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2567,7 +2628,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2582,7 +2644,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2597,7 +2660,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2612,7 +2676,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2627,7 +2692,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2642,7 +2708,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2657,7 +2724,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2672,7 +2740,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2687,7 +2756,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2702,7 +2772,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2717,7 +2788,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2732,7 +2804,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2747,7 +2820,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2762,7 +2836,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2777,7 +2852,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2792,7 +2868,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2807,7 +2884,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2822,7 +2900,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2837,7 +2916,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2852,7 +2932,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2867,7 +2948,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2882,7 +2964,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2897,7 +2980,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2912,7 +2996,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2927,7 +3012,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2942,7 +3028,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2957,7 +3044,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2972,7 +3060,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -2987,7 +3076,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -3002,7 +3092,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -3017,7 +3108,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -3032,7 +3124,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "E2E_FILE_TRANSFER is not true (ff_file_transfer is on-prem-only)" @@ -3167,7 +3260,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_capability_matrix.py::test_list_contacts_across_contacts_adapters", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3302,7 +3395,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_capability_matrix.py::test_memory_survives_adapter_rehydration", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3437,7 +3530,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_capability_matrix.py::test_recall_memory_across_memory_adapters", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3599,7 +3692,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_capability_matrix.py::test_store_memory_across_memory_adapters", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3734,7 +3827,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_capability_matrix.py::test_task_lifecycle_across_task_adapters", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3857,7 +3950,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "global-by-name MCP tools collide across concurrent same-adapter instances (see module docstring)" @@ -3902,7 +3996,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_concurrent_instances.py::test_concurrent_same_adapter_instances_each_reply", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -3944,7 +4038,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -3959,7 +4054,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own ACP session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -3992,7 +4088,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot recall across a rejoin" @@ -4061,7 +4158,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own ACP session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -4076,7 +4174,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -4094,7 +4193,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_context_recall.py::test_recalls_after_rejoin", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4172,7 +4271,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot recall a note from an earlier turn" @@ -4262,7 +4362,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_context_recall.py::test_recalls_within_session", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4361,7 +4461,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_create_chatroom.py::test_agent_creates_a_chatroom", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4460,7 +4560,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_custom_prompt.py::test_custom_prompt_takes_effect_and_coexists_with_platform_tools", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4559,7 +4659,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_identity_and_roster.py::test_reports_identity_and_roster", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4658,7 +4758,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_identity_and_roster.py::test_reports_peer_description_from_passive_roster", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4820,7 +4920,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_loop_suppression.py::test_peer_message_drives_turn_without_loop", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -4844,7 +4944,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ignores exclude_tools, so band_no_reply stays callable" @@ -4859,7 +4960,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ignores exclude_tools, so band_no_reply stays callable" @@ -4874,7 +4976,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "relays the model's final text, so an empty turn can't be scripted reliably" @@ -4898,7 +5001,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ignores exclude_tools, so band_no_reply stays callable" @@ -4913,7 +5017,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ignores exclude_tools, so band_no_reply stays callable" @@ -4949,7 +5054,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_missing_reply_reported.py::test_a_turn_that_did_nothing_is_reported_and_failed", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5084,7 +5189,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_no_reply.py::test_an_fyi_ends_the_turn_through_band_no_reply", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5198,7 +5303,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot recall a seeded fact" @@ -5288,7 +5394,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_noisy_room.py::test_recall_and_ignore_crosstalk_in_busy_room", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5387,7 +5493,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_participant_management.py::test_invites_messages_and_removes_a_peer", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5486,13 +5592,13 @@ "test": "tests/e2e/baseline/smoke/matrix/test_peer_delegation.py::test_peer_initiated_delegation_with_self_recall", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "agno", "lanes": [ "core" @@ -5501,7 +5607,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "anthropic", "lanes": [ "core" @@ -5510,7 +5616,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "claude_sdk", "lanes": [ "core" @@ -5519,7 +5625,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "copilot_sdk", "lanes": [ "core" @@ -5528,7 +5634,7 @@ "reason": null }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "langgraph", "lanes": [ "backends", @@ -5537,13 +5643,14 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "the fixed foreign peer here, so it can't also be the fanned cell" }, { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", + "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::TestForeignPeerRehydration::test_rehydrates_foreign_peer_message", "adapter": "pydantic_ai", "lanes": [ "core" @@ -5551,15 +5658,6 @@ "status": "pass", "reason": null }, - { - "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py::test_rehydrates_foreign_peer_message", - "adapter": "strands", - "lanes": [ - "core" - ], - "status": "pass", - "reason": null - }, { "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_idempotency.py::test_handled_work_not_redrained_on_restart", "adapter": "agno", @@ -5654,7 +5752,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_idempotency.py::test_handled_work_not_redrained_on_restart", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5696,7 +5794,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -5720,7 +5819,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "deferred: cumulative-lifetime counter, not per-turn" @@ -5735,7 +5835,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "usage lives in user-supplied flow internals" @@ -5750,7 +5851,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -5801,7 +5903,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "ACP exposes no per-turn token-usage updates" @@ -5819,7 +5922,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_idempotency.py::test_restart_usage_splits_replay_and_inference", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -5861,7 +5964,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -5975,7 +6079,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -5993,7 +6098,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_offline.py::test_recalls_offline_note_on_cold_boot", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -6035,7 +6140,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -6077,7 +6183,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot rehydrate context across a reboot" @@ -6155,7 +6262,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "recovers context by resuming its own backend session, not via platform /context \u2014 a pass would not validate this rehydration" @@ -6173,7 +6281,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_rehydration_partial.py::test_partial_reboot_preserves_context_and_peer", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -6251,7 +6359,8 @@ "google", "letta", "nooa", - "parlant" + "parlant", + "strands" ], "status": "na", "reason": "terminal echo flow with no memory \u2014 cannot recall a per-room note" @@ -6341,7 +6450,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_room_isolation.py::test_rooms_keep_isolated_context", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null @@ -6391,6 +6500,15 @@ "status": "pass", "reason": null }, + { + "test": "tests/e2e/baseline/smoke/matrix/test_strands_rehydration.py::TestStrandsForeignPeerRehydration::test_rehydrates_foreign_peer_message", + "adapter": "strands", + "lanes": [ + "strands" + ], + "status": "pass", + "reason": null + }, { "test": "tests/e2e/baseline/smoke/matrix/test_tool_round_trip.py::test_custom_tool_round_trips", "adapter": "agno", @@ -6485,7 +6603,7 @@ "test": "tests/e2e/baseline/smoke/matrix/test_tool_round_trip.py::test_custom_tool_round_trips", "adapter": "strands", "lanes": [ - "core" + "strands" ], "status": "pass", "reason": null diff --git a/tests/e2e/baseline/fixtures/diagnostics.py b/tests/e2e/baseline/fixtures/diagnostics.py new file mode 100644 index 000000000..7ce23e9a5 --- /dev/null +++ b/tests/e2e/baseline/fixtures/diagnostics.py @@ -0,0 +1,23 @@ +"""Content-free integration logs for explicitly requested diagnostic runs.""" + +from __future__ import annotations + +import logging +from collections.abc import Iterator +from contextlib import ExitStack + +import pytest + +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.toolkit.logs import sdk_logs_at + +DIAGNOSTIC_PACKAGES = ("band.integrations.parlant", "band.adapters.parlant") + + +@pytest.fixture(autouse=True) +def diagnostic_logs(baseline_settings: BaselineSettings) -> Iterator[None]: + with ExitStack() as stack: + if baseline_settings.run.first_attempt_diagnostics: + for package in DIAGNOSTIC_PACKAGES: + stack.enter_context(sdk_logs_at(package, logging.INFO)) + yield diff --git a/tests/e2e/baseline/guards/test_strands_provider.py b/tests/e2e/baseline/guards/test_strands_provider.py index 25e383346..d204da6ef 100644 --- a/tests/e2e/baseline/guards/test_strands_provider.py +++ b/tests/e2e/baseline/guards/test_strands_provider.py @@ -13,59 +13,59 @@ from tests.baseline.adapter import Adapter from tests.e2e.baseline.agents import lane from tests.e2e.baseline.settings import BaselineSettings, LLMCredentials, LLMModels +from tests.e2e.baseline.smoke.samples.provider import RecordInput from tests.e2e.baseline.toolkit.adapters import build_adapter from tests.e2e.baseline.toolkit.deps import Lane from tests.e2e.baseline.toolkit.tools import ToolSpec from tests.framework_conformance.turnprobes import turn_input -class RecordInput(BaseModel): - """Record a note.""" +class TestStrandsProvider: + @pytest.mark.asyncio + @lane(Lane.STRANDS) + async def test_strands_builder_executes_a_responses_tool_once( + self, monkeypatch: pytest.MonkeyPatch, tmp_path: Path + ) -> None: + from band.testing import ( # noqa: PLC0415 -- Strands is absent from the crewai/parlant lanes + TextTurn, + ToolTurn, + ) + from tests.responsespeer import ( # noqa: PLC0415 -- this HTTP peer uses Strands turn fixtures + ResponsesPeer, + ) - note: str + ledger = tmp_path / "notes.txt" + @declares_turn_effect(TurnEffect.ACT) + def record(args: BaseModel) -> str: + assert isinstance(args, RecordInput) + with ledger.open("a", encoding="utf-8") as notes: + notes.write(args.note + "\n") + return "recorded" -@pytest.mark.asyncio -@lane(Lane.CORE) -async def test_strands_builder_executes_a_responses_tool_once( - monkeypatch: pytest.MonkeyPatch, tmp_path: Path -) -> None: - from band.testing import ( # noqa: PLC0415 -- Strands is absent from the crewai/parlant lanes - TextTurn, - ToolTurn, - ) - from tests.responsespeer import ( # noqa: PLC0415 -- this HTTP peer uses Strands turn fixtures - ResponsesPeer, - ) + tool = ToolSpec(RecordInput, record) + peer = ResponsesPeer([ToolTurn(tool.name, {"note": "hello"}), TextTurn("")]) + monkeypatch.setattr("openai.AsyncOpenAI", peer.client) + settings = BaselineSettings( + llm_credentials=LLMCredentials(openai_api_key="test"), + llm_models=LLMModels(E2E_LLM_MODEL="configured-model"), + ) + adapter = build_adapter(Adapter.STRANDS, settings, tools=[tool]) + await adapter.on_started("Bot", "A bot") + tools = FakeAgentTools() - ledger = tmp_path / "notes.txt" + await adapter.on_event(turn_input(tools)) - @declares_turn_effect(TurnEffect.ACT) - def record(args: BaseModel) -> str: - assert isinstance(args, RecordInput) - with ledger.open("a", encoding="utf-8") as notes: - notes.write(args.note + "\n") - return "recorded" - - tool = ToolSpec(RecordInput, record) - peer = ResponsesPeer([ToolTurn(tool.name, {"note": "hello"}), TextTurn("")]) - monkeypatch.setattr("openai.AsyncOpenAI", peer.client) - settings = BaselineSettings( - llm_credentials=LLMCredentials(openai_api_key="test"), - llm_models=LLMModels(E2E_LLM_MODEL="configured-model"), - ) - adapter = build_adapter(Adapter.STRANDS, settings, tools=[tool]) - await adapter.on_started("Bot", "A bot") - tools = FakeAgentTools() - - await adapter.on_event(turn_input(tools)) - - assert peer.paths == ["/v1/responses", "/v1/responses"] - assert all(request["model"] == "configured-model" for request in peer.requests) - assert all(request["store"] is False for request in peer.requests) - assert all("previous_response_id" not in request for request in peer.requests) - assert peer.tool_outputs(1) == [ - {"type": "function_call_output", "call_id": peer.CALL_ID, "output": "recorded"} - ] - assert ledger.read_text(encoding="utf-8") == "hello\n" - assert tools.turn.complete + assert peer.paths == ["/v1/responses", "/v1/responses"] + assert all(request["model"] == "configured-model" for request in peer.requests) + assert all(request["store"] is False for request in peer.requests) + assert all("previous_response_id" not in request for request in peer.requests) + assert peer.tool_outputs(1) == [ + { + "type": "function_call_output", + "call_id": peer.CALL_ID, + "output": "recorded", + } + ] + assert ledger.read_text(encoding="utf-8") == "hello\n" + assert tools.turn.complete diff --git a/tests/e2e/baseline/lane_selection.py b/tests/e2e/baseline/lane_selection.py index 290620bd6..f1d98cad1 100644 --- a/tests/e2e/baseline/lane_selection.py +++ b/tests/e2e/baseline/lane_selection.py @@ -199,7 +199,7 @@ def assert_every_item_is_schedulable(items: list[pytest.Item]) -> None: homes = _home_lanes(item, lane_of) override = _override_lane(item) if override is not None: - hosts = hosting_lanes(homes) + hosts = hosting_lanes(item_frameworks(item)) if override not in hosts: offenders.append( f"{item.nodeid} pins @lane({override!r}) but no lane hosts all its " @@ -208,7 +208,7 @@ def assert_every_item_is_schedulable(items: list[pytest.Item]) -> None: continue if len(homes) <= 1: continue # single home lane (or adapter-agnostic) — always schedulable - hosts = hosting_lanes(homes) + hosts = hosting_lanes(item_frameworks(item)) if hosts: offenders.append( f"{item.nodeid} spans home lanes {sorted(homes)} but shares an extra; " diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/__init__.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/conftest.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/conftest.py new file mode 100644 index 000000000..2022c28b1 --- /dev/null +++ b/tests/e2e/baseline/smoke/adapters/copilotsdk/conftest.py @@ -0,0 +1,27 @@ +"""Test-owned Copilot homes for bespoke native-runtime scenarios.""" + +from __future__ import annotations + +from collections.abc import Callable +from functools import partial +from pathlib import Path + +import pytest + +from band.adapters.copilot_sdk import CopilotSDKAdapter +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.toolkit.builders import ( + build_copilot_sdk_adapter, + copilot_home_dir, +) + + +@pytest.fixture +def copilot_adapter( + baseline_settings: BaselineSettings, tmp_path: Path +) -> Callable[..., CopilotSDKAdapter]: + return partial( + build_copilot_sdk_adapter, + baseline_settings, + base_directory=copilot_home_dir(str(tmp_path)), + ) diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/test_handler.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_handler.py new file mode 100644 index 000000000..97b89f1ec --- /dev/null +++ b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_handler.py @@ -0,0 +1,101 @@ +"""Isolated Copilot SDK live behavior.""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import pytest + +from band.adapters.copilot_sdk import ( + _COPILOT_SDK_AVAILABLE, + CopilotSDKAdapter, +) +from tests.e2e.baseline.agents import Lane, lane +from tests.e2e.baseline.flaky import flaky_infra +from tests.e2e.baseline.requires import Dep, requires +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.smoke.samples.sample_agents import unique_marker +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import ( + ResourceManager, + running_provisioned_agent, +) +from tests.e2e.baseline.toolkit.user_ops import UserOps + +pytestmark = pytest.mark.skipif( + not _COPILOT_SDK_AVAILABLE, + reason="github-copilot-sdk not installed (pip install band-sdk[copilot_sdk])", +) + + +class TestAskUserHandler: + @lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core + @requires(Dep.ANTHROPIC) + @flaky_infra( + "Copilot runtime boot + ask_user double round-trip can time out transiently" + ) + # ask_user adds a second model round trip (ask -> handler answers -> final + # reply) on top of Copilot's own runtime boot. + @pytest.mark.timeout(extra=120) + @pytest.mark.asyncio(loop_scope="session") + async def test_copilot_ask_user_handler_round_trips_to_room_reply( + self, + copilot_adapter: Callable[..., CopilotSDKAdapter], + baseline_settings: BaselineSettings, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + ) -> None: + """``ask_user=`` pauses the turn, a programmatic operator answers. + + The operator's answer is a high-entropy token the user never utters, so the + reply containing it proves the answer flowed through the handler — not + model invention. Guards the adapter's ``ask_user`` allowlisting and handler + forwarding (without either, the model cannot ask and the handler never + fires). + """ + + operator_channel = unique_marker("channel") + asked: list[dict[str, Any]] = [] + + async def fake_operator( + request: dict[str, Any], context: dict[str, str] + ) -> dict[str, Any]: + asked.append(dict(request)) + return {"answer": operator_channel, "wasFreeform": True} + + adapter = copilot_adapter( + ask_user=fake_operator, + custom_section=( + "Keep responses short and concise. A human operator is " + "available through the ask_user tool for decisions you " + "cannot make alone." + ), + ) + + async with running_provisioned_agent( + adapter, resource_manager, label="copilot-ask-user" + ) as agent: + room_id = await resource_manager.provision_room( + title="e2e-copilot-ask-user", participants=[agent.id] + ) + async with reply_capture(room_id) as capture: + mid = await user_ops.send_message( + room_id, + "I need to deploy release v2. Use the ask_user tool to ask " + "your operator which channel to deploy to and wait for my " + "response before continuing. Then reply stating exactly " + "the channel the operator chose.", + mention_id=agent.id, + mention_name=agent.name, + ) + replies = await capture.wait_for_reply( + mid, agent.id, deadline_s=baseline_settings.e2e_timeout * 2 + ) + + assert asked, "the model never called ask_user (handler did not fire)" + assert asked[0].get("question"), f"ask_user carried no question: {asked[0]!r}" + # Only the operator handler can supply this token; the reply containing it + # proves the answer round-tripped through the turn. + replies.assert_contains_any([operator_channel]) diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/test_resume.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_resume.py new file mode 100644 index 000000000..434f5c1e8 --- /dev/null +++ b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_resume.py @@ -0,0 +1,119 @@ +"""Isolated Copilot SDK live behavior.""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +import pytest + +from band.adapters.copilot_sdk import ( + _COPILOT_SDK_AVAILABLE, + CopilotSDKAdapter, +) +from tests.e2e.baseline.agents import Lane, lane +from tests.e2e.baseline.flaky import flaky_infra +from tests.e2e.baseline.requires import Dep, requires +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.smoke.samples.sample_agents import unique_marker +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import ( + ResourceManager, + running_agent, +) +from tests.e2e.baseline.toolkit.user_ops import UserOps + +pytestmark = pytest.mark.skipif( + not _COPILOT_SDK_AVAILABLE, + reason="github-copilot-sdk not installed (pip install band-sdk[copilot_sdk])", +) + + +class TestResumeMiss: + @lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core + @requires(Dep.ANTHROPIC) + @flaky_infra( + "two fresh Copilot runtime boots (resume-miss setup) can time out transiently" + ) + # Two agent lifecycles, each booting a fresh Copilot runtime into an empty + # base_directory (the resume-miss setup) — the heaviest boot path in this file. + @pytest.mark.timeout(extra=180) + @pytest.mark.asyncio(loop_scope="session") + async def test_copilot_recall_via_injected_history_when_resume_misses( + self, + copilot_adapter: Callable[..., CopilotSDKAdapter], + baseline_settings: BaselineSettings, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + tmp_path: Any, + ) -> None: + """Recall must survive a restart that invalidates Copilot's *native* resume. + + A rejoin against the same on-disk state (a plain stop/restart) would let + Copilot's own session resume answer for free. This test gives each phase a + fresh ``base_directory``, so phase 2's resume finds no state and recall + must flow through the converter's injected text history instead. Two facts + are asserted after the restart: a tracking marker the USER stated (plain + injected-history recall), and a calibration answer the AGENT produced in + phase 1 — the user never utters that answer, so the agent's own injected + replies are its only possible source (the regression case for one-sided + injected history). + """ + + tracking_marker = unique_marker("marker") + agent_fact = "blue" + + def make_adapter(phase: str) -> CopilotSDKAdapter: + # A fresh base_directory per phase: phase 2 has no on-disk session + # state, so Copilot's native resume cannot help. + return copilot_adapter(base_directory=str(tmp_path / phase)) + + identity = await resource_manager.provision_agent("copilot-resume-miss") + room_id = await resource_manager.provision_room( + title="e2e-copilot-resume-miss", participants=[identity.id] + ) + + # Phase 1: seed a user fact and make the agent produce its own fact. + async with ( + running_agent(identity, make_adapter("phase1"), baseline_settings), + reply_capture(room_id) as capture, + ): + mid = await user_ops.send_message( + room_id, + "Create a short project log note for later reference. The " + f"tracking marker is {tracking_marker}. Also answer this " + "calibration question inside your reply: what color is a " + "clear daytime sky? Reply in one short sentence that includes " + "the tracking marker and the color answer.", + mention_id=identity.id, + mention_name=identity.name, + ) + replies = await capture.wait_for_reply( + mid, identity.id, deadline_s=baseline_settings.e2e_timeout + ) + replies.assert_contains_any([tracking_marker]) + # The user never uttered this answer; it must come from the + # agent's phase-1 reply when phase 2 reconstructs history. + replies.assert_contains_any([agent_fact]) + + # Phase 2: fresh process state AND fresh Copilot state directory — recall + # can only come from the platform history the adapter injects. + async with ( + running_agent(identity, make_adapter("phase2"), baseline_settings), + reply_capture(room_id) as capture, + ): + mid = await user_ops.send_message( + room_id, + "From the earlier project log, what was the tracking marker " + "and what color answer did you give? Reply with both.", + mention_id=identity.id, + mention_name=identity.name, + ) + replies = await capture.wait_for_reply( + mid, identity.id, deadline_s=baseline_settings.e2e_timeout + ) + replies.assert_contains_any([tracking_marker]) + # The user never uttered this answer — only the agent's own + # injected phase-1 reply can supply it. + replies.assert_contains_any([agent_fact]) diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/test_roomquestion.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_roomquestion.py new file mode 100644 index 000000000..bf302ac10 --- /dev/null +++ b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_roomquestion.py @@ -0,0 +1,107 @@ +"""Isolated Copilot SDK live behavior.""" + +from __future__ import annotations + +from collections.abc import Callable + +import pytest + +from band.adapters.copilot_sdk import ( + _COPILOT_SDK_AVAILABLE, + ASK_USER_ROOM, + CopilotSDKAdapter, +) +from tests.e2e.baseline.agents import Lane, lane +from tests.e2e.baseline.flaky import flaky_infra +from tests.e2e.baseline.requires import Dep, requires +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.smoke.samples.sample_agents import unique_marker +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import ( + ResourceManager, + running_provisioned_agent, +) +from tests.e2e.baseline.toolkit.user_ops import UserOps + +pytestmark = pytest.mark.skipif( + not _COPILOT_SDK_AVAILABLE, + reason="github-copilot-sdk not installed (pip install band-sdk[copilot_sdk])", +) + + +class TestRoomQuestion: + @lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core + @requires(Dep.ANTHROPIC) + @flaky_infra( + "two full live turns plus Copilot runtime boot can time out transiently" + ) + @pytest.mark.timeout(extra=180) # two full turns (question turn + answer turn) + @pytest.mark.asyncio(loop_scope="session") + async def test_copilot_ask_user_room_question_answered_by_next_message( + self, + copilot_adapter: Callable[..., CopilotSDKAdapter], + baseline_settings: BaselineSettings, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + ) -> None: + """``ask_user="room"`` posts the question into the room and ends the turn; + the user's next room message answers it on the same persisted session. + + The answer is a high-entropy token never uttered before the answer, so a + reply containing it proves the answer flowed through the room round trip — + not model invention. + """ + + secret_channel = unique_marker("channel") + adapter = copilot_adapter( + ask_user=ASK_USER_ROOM, + custom_section=( + "Keep responses short and concise. Never invent answers to " + "questions you asked — wait for the user." + ), + ) + + async with running_provisioned_agent( + adapter, resource_manager, label="copilot-ask-user-room" + ) as agent: + room_id = await resource_manager.provision_room( + title="e2e-copilot-ask-user-room", participants=[agent.id] + ) + async with reply_capture(room_id) as capture: + # Turn 1: the trigger makes the model call ask_user; the question + # must land in the room, not anywhere else. + mark = capture.messages.snapshot() + mid = await user_ops.send_message( + room_id, + "Use the ask_user tool to ask me which channel to deploy " + "release v2 to. After I answer, reply stating exactly the " + "channel I chose.", + mention_id=agent.id, + mention_name=agent.name, + ) + replies = await capture.wait_for_reply( + mid, + agent.id, + since=mark, + deadline_s=baseline_settings.e2e_timeout * 2, + ) + replies.assert_contains_any(["channel"]) + + # Turn 2: the user's next room message is the answer. + mark = capture.messages.snapshot() + mid = await user_ops.send_message( + room_id, + f"Deploy to the {secret_channel} channel.", + mention_id=agent.id, + mention_name=agent.name, + ) + replies = await capture.wait_for_reply( + mid, + agent.id, + since=mark, + deadline_s=baseline_settings.e2e_timeout * 2, + ) + # Only the answer message contains this token; the reply relaying + # it proves the question/answer round-tripped through the room. + replies.assert_contains_any([secret_channel]) diff --git a/tests/e2e/baseline/smoke/adapters/copilotsdk/test_sharedclient.py b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_sharedclient.py new file mode 100644 index 000000000..b0e96ba1e --- /dev/null +++ b/tests/e2e/baseline/smoke/adapters/copilotsdk/test_sharedclient.py @@ -0,0 +1,112 @@ +"""Isolated Copilot SDK live behavior.""" + +from __future__ import annotations + +import asyncio +from collections.abc import Callable +from pathlib import Path +from typing import Any + +import pytest + +from band.adapters.copilot_sdk import ( + _COPILOT_SDK_AVAILABLE, + CopilotSDKAdapter, +) +from tests.e2e.baseline.agents import Lane, lane +from tests.e2e.baseline.flaky import flaky_infra +from tests.e2e.baseline.requires import Dep, requires +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.toolkit.builders import copilot_home_dir +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import ( + ResourceManager, + running_agent, +) +from tests.e2e.baseline.toolkit.user_ops import UserOps + +pytestmark = pytest.mark.skipif( + not _COPILOT_SDK_AVAILABLE, + reason="github-copilot-sdk not installed (pip install band-sdk[copilot_sdk])", +) + + +class TestSharedClient: + @lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core + @requires(Dep.ANTHROPIC) + @flaky_infra( + "several live turns across two adapter lifecycles can time out transiently" + ) + # Two sequential adapter lifecycles on one shared runtime, the first serving + # two concurrent room sessions — several live turns, so widen the outer budget. + @pytest.mark.timeout(extra=180) + @pytest.mark.asyncio(loop_scope="session") + async def test_copilot_shared_client_across_adapter_lifecycles( + self, + copilot_adapter: Callable[..., CopilotSDKAdapter], + baseline_settings: BaselineSettings, + tmp_path: Path, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + ) -> None: + """Proves the Copilot SDK's one-client/many-sessions model through the + adapter against the live platform: + + 1. one ``CopilotClient`` is created by the test (the owner); + 2. an adapter *borrows* it and serves TWO rooms with turns in flight + CONCURRENTLY — two isolated parallel sessions on one runtime; + 3. the first adapter shuts down and a successor adapter reuses the same + still-running client — the borrowed client must survive an adapter's + full cleanup (``owns_client=False`` contract). + """ + from copilot import ( # noqa: PLC0415 -- copilot_sdk extra; file collects even when absent, skipped via _COPILOT_SDK_AVAILABLE at test time + CopilotClient, + ) + + identity = await resource_manager.provision_agent("copilot-shared-client") + room_a = await resource_manager.provision_room( + title="e2e-copilot-shared-a", participants=[identity.id] + ) + room_b = await resource_manager.provision_room( + title="e2e-copilot-shared-b", participants=[identity.id] + ) + + async def smoke(room_id: str, *, prompt: str = "Please say hello.") -> None: + async with reply_capture(room_id) as capture: + mid = await user_ops.send_message( + room_id, + prompt, + mention_id=identity.id, + mention_name=identity.name, + ) + replies = await capture.wait_for_reply( + mid, identity.id, deadline_s=baseline_settings.e2e_timeout + ) + replies.assert_present(what="a copilot_sdk[shared-client] reply") + + def make_shared_adapter(client: Any) -> CopilotSDKAdapter: + return copilot_adapter(client=client) + + # The test owns the client; adapters only borrow it. + client = CopilotClient( + use_logged_in_user=False, base_directory=copilot_home_dir(str(tmp_path)) + ) + try: + async with running_agent( + identity, make_shared_adapter(client), baseline_settings + ): + # Two rooms with turns in flight AT THE SAME TIME — parallel + # sessions on one runtime, serialized only per room. + await asyncio.gather(smoke(room_a), smoke(room_b)) + + # First adapter fully cleaned up; the borrowed client must have + # survived — a successor adapter reuses it without a restart. + async with running_agent( + identity, make_shared_adapter(client), baseline_settings + ): + # A new request: the resumed session already answered the first, + # and a repeat of it may rightly be declined with band_no_reply. + await smoke(room_a, prompt="Please say goodbye.") + finally: + await client.stop() diff --git a/tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py b/tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py deleted file mode 100644 index 3524c09db..000000000 --- a/tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py +++ /dev/null @@ -1,391 +0,0 @@ -"""Copilot SDK showcase smokes — the toolkit driving the Copilot adapter live. - -Copilot SDK is a ``core``-lane matrix adapter gated only on the Anthropic BYOK -key (the singular provider replaces Copilot-hosted inference, so GitHub auth is -not required; see ``toolkit/builders.py``). The generic matrix (``smoke/matrix/``) -already runs the standard scenarios against it via the registry builder. These -are Copilot-focused instead: ``ask_user`` routing (handler and room mode), recall -when Copilot's *native* session resume misses, and one client shared across adapter -lifecycles — none of which the generic builder's ``prompt``/``features``/``tools`` -contract can express, so each test constructs ``CopilotSDKAdapter`` by hand (like -``test_parlant.py``) and hands it to the toolkit's run primitives. - -Because construction is bespoke, these expose no adapter binding to the lane -selector (no ``@with_adapters``/``@per_adapter`` — that would demand the ``agent`` -fixture and re-provision generically). So gating stays explicit (``@requires``) and -lane scoping is pinned with ``@lane(Lane.CORE)`` — without it the selector would see -no framework and run these heavy smokes in *every* lane. - -Run with: - E2E_TESTS_ENABLED=true BAND_E2E_LANE=core uv run pytest \\ - tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py -v -s --no-cov -""" - -from __future__ import annotations - -import asyncio -from typing import Any - -import pytest - -from band.adapters.copilot_sdk import ( - _COPILOT_SDK_AVAILABLE, - ASK_USER_ROOM, - CopilotSDKAdapter, - CopilotSDKAdapterConfig, -) -from tests.e2e.baseline.agents import Lane, lane -from tests.e2e.baseline.flaky import flaky_infra -from tests.e2e.baseline.requires import Dep, requires -from tests.e2e.baseline.settings import BaselineSettings -from tests.e2e.baseline.smoke.samples.sample_agents import unique_marker -from tests.e2e.baseline.toolkit.capture import CaptureFactory -from tests.e2e.baseline.toolkit.provisioning import ( - ResourceManager, - running_agent, - running_provisioned_agent, -) -from tests.e2e.baseline.toolkit.user_ops import UserOps - -pytestmark = pytest.mark.skipif( - not _COPILOT_SDK_AVAILABLE, - reason="github-copilot-sdk not installed (pip install band-sdk[copilot_sdk])", -) - - -def _copilot_adapter( - settings: BaselineSettings, - *, - client: Any | None = None, - ask_user: Any | None = None, - **config_overrides: Any, -) -> CopilotSDKAdapter: - """The showcase's base ``CopilotSDKAdapter`` (BYOK on Anthropic). - - Mirrors the registry builder's shape (``toolkit/builders.py``) so these - bespoke tests don't re-derive it; ``ask_user`` and ``config_overrides`` - layer the one knob each test actually cares about (``ask_user=``, - ``base_directory=``). - """ - from copilot import ( # noqa: PLC0415 -- copilot_sdk extra; file collects even when absent, skipped via _COPILOT_SDK_AVAILABLE at test time - ProviderConfig, - ) - - config = CopilotSDKAdapterConfig( - model=settings.llm_models.anthropic_model, - use_logged_in_user=False, - custom_section=config_overrides.pop( - "custom_section", "Keep responses short and concise." - ), - **config_overrides, - ) - return CopilotSDKAdapter( - config, - client=client, - provider=ProviderConfig( - type="anthropic", - base_url="https://api.anthropic.com", - api_key=settings.llm_credentials.anthropic_api_key, - ), - ask_user=ask_user, - ) - - -@lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core -@requires(Dep.ANTHROPIC) -@flaky_infra( - "Copilot runtime boot + ask_user double round-trip can time out transiently" -) -# ask_user adds a second model round trip (ask -> handler answers -> final -# reply) on top of Copilot's own runtime boot. -@pytest.mark.timeout(extra=120) -@pytest.mark.asyncio(loop_scope="session") -async def test_copilot_ask_user_handler_round_trips_to_room_reply( - baseline_settings: BaselineSettings, - resource_manager: ResourceManager, - user_ops: UserOps, - reply_capture: CaptureFactory, -) -> None: - """``ask_user=`` pauses the turn, a programmatic operator answers. - - The operator's answer is a high-entropy token the user never utters, so the - reply containing it proves the answer flowed through the handler — not - model invention. Guards the adapter's ``ask_user`` allowlisting and handler - forwarding (without either, the model cannot ask and the handler never - fires). - """ - - operator_channel = unique_marker("channel") - asked: list[dict[str, Any]] = [] - - async def fake_operator( - request: dict[str, Any], context: dict[str, str] - ) -> dict[str, Any]: - asked.append(dict(request)) - return {"answer": operator_channel, "wasFreeform": True} - - adapter = _copilot_adapter( - baseline_settings, - ask_user=fake_operator, - custom_section=( - "Keep responses short and concise. A human operator is " - "available through the ask_user tool for decisions you " - "cannot make alone." - ), - ) - - async with running_provisioned_agent( - adapter, resource_manager, label="copilot-ask-user" - ) as agent: - room_id = await resource_manager.provision_room( - title="e2e-copilot-ask-user", participants=[agent.id] - ) - async with reply_capture(room_id) as capture: - mid = await user_ops.send_message( - room_id, - "I need to deploy release v2. Use the ask_user tool to ask " - "your operator which channel to deploy to and wait for my " - "response before continuing. Then reply stating exactly " - "the channel the operator chose.", - mention_id=agent.id, - mention_name=agent.name, - ) - replies = await capture.wait_for_reply( - mid, agent.id, deadline_s=baseline_settings.e2e_timeout * 2 - ) - - assert asked, "the model never called ask_user (handler did not fire)" - assert asked[0].get("question"), f"ask_user carried no question: {asked[0]!r}" - # Only the operator handler can supply this token; the reply containing it - # proves the answer round-tripped through the turn. - replies.assert_contains_any([operator_channel]) - - -@lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core -@requires(Dep.ANTHROPIC) -@flaky_infra("two full live turns plus Copilot runtime boot can time out transiently") -@pytest.mark.timeout(extra=180) # two full turns (question turn + answer turn) -@pytest.mark.asyncio(loop_scope="session") -async def test_copilot_ask_user_room_question_answered_by_next_message( - baseline_settings: BaselineSettings, - resource_manager: ResourceManager, - user_ops: UserOps, - reply_capture: CaptureFactory, -) -> None: - """``ask_user="room"`` posts the question into the room and ends the turn; - the user's next room message answers it on the same persisted session. - - The answer is a high-entropy token never uttered before the answer, so a - reply containing it proves the answer flowed through the room round trip — - not model invention. - """ - - secret_channel = unique_marker("channel") - adapter = _copilot_adapter( - baseline_settings, - ask_user=ASK_USER_ROOM, - custom_section=( - "Keep responses short and concise. Never invent answers to " - "questions you asked — wait for the user." - ), - ) - - async with running_provisioned_agent( - adapter, resource_manager, label="copilot-ask-user-room" - ) as agent: - room_id = await resource_manager.provision_room( - title="e2e-copilot-ask-user-room", participants=[agent.id] - ) - async with reply_capture(room_id) as capture: - # Turn 1: the trigger makes the model call ask_user; the question - # must land in the room, not anywhere else. - mark = capture.messages.snapshot() - mid = await user_ops.send_message( - room_id, - "Use the ask_user tool to ask me which channel to deploy " - "release v2 to. After I answer, reply stating exactly the " - "channel I chose.", - mention_id=agent.id, - mention_name=agent.name, - ) - replies = await capture.wait_for_reply( - mid, agent.id, since=mark, deadline_s=baseline_settings.e2e_timeout * 2 - ) - replies.assert_contains_any(["channel"]) - - # Turn 2: the user's next room message is the answer. - mark = capture.messages.snapshot() - mid = await user_ops.send_message( - room_id, - f"Deploy to the {secret_channel} channel.", - mention_id=agent.id, - mention_name=agent.name, - ) - replies = await capture.wait_for_reply( - mid, agent.id, since=mark, deadline_s=baseline_settings.e2e_timeout * 2 - ) - # Only the answer message contains this token; the reply relaying - # it proves the question/answer round-tripped through the room. - replies.assert_contains_any([secret_channel]) - - -@lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core -@requires(Dep.ANTHROPIC) -@flaky_infra( - "two fresh Copilot runtime boots (resume-miss setup) can time out transiently" -) -# Two agent lifecycles, each booting a fresh Copilot runtime into an empty -# base_directory (the resume-miss setup) — the heaviest boot path in this file. -@pytest.mark.timeout(extra=180) -@pytest.mark.asyncio(loop_scope="session") -async def test_copilot_recall_via_injected_history_when_resume_misses( - baseline_settings: BaselineSettings, - resource_manager: ResourceManager, - user_ops: UserOps, - reply_capture: CaptureFactory, - tmp_path: Any, -) -> None: - """Recall must survive a restart that invalidates Copilot's *native* resume. - - A rejoin against the same on-disk state (a plain stop/restart) would let - Copilot's own session resume answer for free. This test gives each phase a - fresh ``base_directory``, so phase 2's resume finds no state and recall - must flow through the converter's injected text history instead. Two facts - are asserted after the restart: a tracking marker the USER stated (plain - injected-history recall), and a calibration answer the AGENT produced in - phase 1 — the user never utters that answer, so the agent's own injected - replies are its only possible source (the regression case for one-sided - injected history). - """ - - tracking_marker = unique_marker("marker") - agent_fact = "blue" - - def make_adapter(phase: str) -> CopilotSDKAdapter: - # A fresh base_directory per phase: phase 2 has no on-disk session - # state, so Copilot's native resume cannot help. - return _copilot_adapter(baseline_settings, base_directory=str(tmp_path / phase)) - - identity = await resource_manager.provision_agent("copilot-resume-miss") - room_id = await resource_manager.provision_room( - title="e2e-copilot-resume-miss", participants=[identity.id] - ) - - # Phase 1: seed a user fact and make the agent produce its own fact. - async with ( - running_agent(identity, make_adapter("phase1"), baseline_settings), - reply_capture(room_id) as capture, - ): - mid = await user_ops.send_message( - room_id, - "Create a short project log note for later reference. The " - f"tracking marker is {tracking_marker}. Also answer this " - "calibration question inside your reply: what color is a " - "clear daytime sky? Reply in one short sentence that includes " - "the tracking marker and the color answer.", - mention_id=identity.id, - mention_name=identity.name, - ) - replies = await capture.wait_for_reply( - mid, identity.id, deadline_s=baseline_settings.e2e_timeout - ) - replies.assert_contains_any([tracking_marker]) - # The user never uttered this answer; it must come from the - # agent's phase-1 reply when phase 2 reconstructs history. - replies.assert_contains_any([agent_fact]) - - # Phase 2: fresh process state AND fresh Copilot state directory — recall - # can only come from the platform history the adapter injects. - async with ( - running_agent(identity, make_adapter("phase2"), baseline_settings), - reply_capture(room_id) as capture, - ): - mid = await user_ops.send_message( - room_id, - "From the earlier project log, what was the tracking marker " - "and what color answer did you give? Reply with both.", - mention_id=identity.id, - mention_name=identity.name, - ) - replies = await capture.wait_for_reply( - mid, identity.id, deadline_s=baseline_settings.e2e_timeout - ) - replies.assert_contains_any([tracking_marker]) - # The user never uttered this answer — only the agent's own - # injected phase-1 reply can supply it. - replies.assert_contains_any([agent_fact]) - - -@lane(Lane.CORE) # bespoke build exposes no framework; pin scheduling to core -@requires(Dep.ANTHROPIC) -@flaky_infra( - "several live turns across two adapter lifecycles can time out transiently" -) -# Two sequential adapter lifecycles on one shared runtime, the first serving -# two concurrent room sessions — several live turns, so widen the outer budget. -@pytest.mark.timeout(extra=180) -@pytest.mark.asyncio(loop_scope="session") -async def test_copilot_shared_client_across_adapter_lifecycles( - baseline_settings: BaselineSettings, - resource_manager: ResourceManager, - user_ops: UserOps, - reply_capture: CaptureFactory, -) -> None: - """Proves the Copilot SDK's one-client/many-sessions model through the - adapter against the live platform: - - 1. one ``CopilotClient`` is created by the test (the owner); - 2. an adapter *borrows* it and serves TWO rooms with turns in flight - CONCURRENTLY — two isolated parallel sessions on one runtime; - 3. the first adapter shuts down and a successor adapter reuses the same - still-running client — the borrowed client must survive an adapter's - full cleanup (``owns_client=False`` contract). - """ - from copilot import ( # noqa: PLC0415 -- copilot_sdk extra; file collects even when absent, skipped via _COPILOT_SDK_AVAILABLE at test time - CopilotClient, - ) - - identity = await resource_manager.provision_agent("copilot-shared-client") - room_a = await resource_manager.provision_room( - title="e2e-copilot-shared-a", participants=[identity.id] - ) - room_b = await resource_manager.provision_room( - title="e2e-copilot-shared-b", participants=[identity.id] - ) - - async def smoke(room_id: str, *, prompt: str = "Please say hello.") -> None: - async with reply_capture(room_id) as capture: - mid = await user_ops.send_message( - room_id, - prompt, - mention_id=identity.id, - mention_name=identity.name, - ) - replies = await capture.wait_for_reply( - mid, identity.id, deadline_s=baseline_settings.e2e_timeout - ) - replies.assert_present(what="a copilot_sdk[shared-client] reply") - - def make_shared_adapter(client: Any) -> CopilotSDKAdapter: - return _copilot_adapter(baseline_settings, client=client) - - # The test owns the client; adapters only borrow it. - client = CopilotClient(use_logged_in_user=False) - try: - async with running_agent( - identity, make_shared_adapter(client), baseline_settings - ): - # Two rooms with turns in flight AT THE SAME TIME — parallel - # sessions on one runtime, serialized only per room. - await asyncio.gather(smoke(room_a), smoke(room_b)) - - # First adapter fully cleaned up; the borrowed client must have - # survived — a successor adapter reuses it without a restart. - async with running_agent( - identity, make_shared_adapter(client), baseline_settings - ): - # A new request: the resumed session already answered the first, - # and a repeat of it may rightly be declined with band_no_reply. - await smoke(room_a, prompt="Please say goodbye.") - finally: - await client.stop() diff --git a/tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py b/tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py index b88c29755..80bfcc0ff 100644 --- a/tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py +++ b/tests/e2e/baseline/smoke/matrix/test_rehydration_cross_framework.py @@ -1,39 +1,4 @@ -"""Matrix scenario: a *different-framework* peer's message rehydrates into A's context. - -Existing rehydration/recall tests have the **user** author the recalled fact -(``test_context_recall``, ``test_rehydration_offline``) or recall a user-authored note -alongside a live peer (``test_rehydration_partial``); none proves that one framework -rehydrates a message a *different* framework authored. Here -peer B (langgraph, an OpenAI-backed LangChain agent) authors a message — carrying a -neutral marker and mentioning A — while agent A (each of the other core frameworks) is -offline; then A cold-boots and must recall the marker from its bootstrap ``/context``. - -Why B must mention A — and why this is *text*, not a tool call: rehydrated ``/context`` -is **agent-scoped** — the platform returns only messages the agent authored or was -*mentioned in*, not the whole room (see ``execution.py`` ``get_agent_chat_context`` + -``preprocessing/default._load_history``). So B's message only reaches A's context if it -mentions A. A tool call/result B makes is B's own and mentions no one, so it can *never* -enter A's context — cross-framework **tool-event** rehydration is therefore not -observable through ``/context`` and is a deliberate non-goal here. - -What this proves: a message **authored by a different framework** rehydrates into A's -agent-scoped context and A recalls it. Message text is framework-neutral on the platform, -so this is a deliberately narrow, honest claim: the cross-framework analogue of the -same-framework ``test_rehydration_offline`` / ``test_rehydration_partial`` recall. - -Leak-avoidance / fail-loud setup: the marker is a neutral ``unique_marker`` (not a -credential-shaped token models refuse to echo). B is driven to send exactly one message -that mentions A and carries the marker; a **setup precondition** asserts that message -actually mentioned A (by metadata) and carried the marker — so a peer that failed to -mention A is a loud setup red, not a silent "A couldn't recall" that looks like a -rehydration bug. - -Lifecycle: A's identity via ``cell`` (owns its boot); B's via the ``peer`` fixture (a -different-framework cell the test drives). The two runs are strictly sequential — B's -run fully exits before A boots — so ``track_running`` never sees overlapping runs of one -identity. ``lane=Lane.CORE`` + excluding ``LANGGRAPH`` keeps A and B both in the core -lane (schedulable, no cross-lane) and guarantees A is never langgraph (so A ≠ B). -""" +"""A cold adapter recalls a message authored by its LangGraph peer.""" from __future__ import annotations @@ -41,105 +6,38 @@ from tests.e2e.baseline.agents import Adapter, ExcludedAdapter, Lane, per_adapter from tests.e2e.baseline.settings import BaselineSettings -from tests.e2e.baseline.smoke.samples.sample_agents import REPLY_PROMPT, unique_marker +from tests.e2e.baseline.smoke.samples.rehydration import rehydrate_foreign_peer +from tests.e2e.baseline.smoke.samples.sample_agents import REPLY_PROMPT from tests.e2e.baseline.toolkit.capture import CaptureFactory -from tests.e2e.baseline.toolkit.provisioning import ( - AdapterCell, - ProvisionedAgent, - ResourceManager, - agent_rest_client, -) +from tests.e2e.baseline.toolkit.provisioning import AdapterCell, ResourceManager from tests.e2e.baseline.toolkit.user_ops import UserOps -# Never names the token, so A can only answer from rehydrated context. -RECALL_TOKEN_REQUEST = ( - "Earlier the other participant sent you a short note with a token. " - "Call band_send_message to reply with exactly that complete token string " - "and nothing else." -) - - -def _relay_prompt(target: ProvisionedAgent, marker: str) -> str: - """A prompt that drives B to send one message mentioning A and carrying the marker.""" - return ( - REPLY_PROMPT + f" When asked, send exactly one message that mentions the " - f"participant '{target.name}' and contains this exact token: {marker}. Address " - "it to them and include nothing else of substance." - ) - - -@per_adapter( - lane=Lane.CORE, - exclude=[ - ExcludedAdapter( - Adapter.LANGGRAPH, - "the fixed foreign peer here, so it can't also be the fanned cell", - ) - ], - peer=Adapter.LANGGRAPH, - prompt=REPLY_PROMPT, -) -@pytest.mark.timeout(extra=300) # peer boot + relay turn + fresh A boot + recall turn -@pytest.mark.asyncio(loop_scope="session") -async def test_rehydrates_foreign_peer_message( - cell: AdapterCell, - peer: AdapterCell, - resource_manager: ResourceManager, - user_ops: UserOps, - reply_capture: CaptureFactory, - baseline_settings: BaselineSettings, -) -> None: - """A recalls a marker a *different-framework* peer stated, via agent-scoped ``/context``. - - Requests ``cell`` (A's lifecycle) and ``peer`` (B, a different framework). B authors a - message mentioning A that carries the marker (so it enters A's agent-scoped context), - then stops; A cold-boots and must recall the marker from bootstrap rehydration. The - per-cell ``@requires`` gate (folded with the peer's) rides on the parametrization. - """ - marker = unique_marker("note") - recaller = await cell.provision(label=f"recaller-{cell.adapter_id}") - speaker = await peer.provision(label=f"speaker-{peer.adapter_id}") - room_id = await resource_manager.provision_room( - title=f"e2e-xframework-{cell.adapter_id}", - participants=[recaller.id, speaker.id], - ) - - # B (a different framework) authors one message that mentions A and carries the - # marker, then stops. Mentioning A is what lands it in A's agent-scoped /context. - async with ( - peer.run_as(speaker, prompt=_relay_prompt(recaller, marker)), - reply_capture(room_id) as capture, - ): - probe = capture.messages.snapshot() - mid = await user_ops.send_message( - room_id, - f"Please pass a note to {recaller.name}.", - mention_id=speaker.id, - mention_name=speaker.name, - ) - replies = await capture.wait_for_reply(mid, speaker.id, since=probe) - # Setup precondition (fail loud): B's marker-bearing message must actually - # mention A — else it never reaches A's context and a later recall miss would - # look like a rehydration bug rather than a setup failure. - replies.mentioning(recaller.id).assert_contains_any([marker]) - context = await agent_rest_client( - recaller, baseline_settings - ).agent_api_context.get_agent_chat_context(chat_id=room_id) - assert any(marker in (item.content or "") for item in context.data or []), ( - f"agent-scoped bootstrap context lost the exact foreign token {marker!r}" +class TestForeignPeerRehydration: + @per_adapter( + lane=Lane.CORE, + exclude=[ + ExcludedAdapter( + Adapter.LANGGRAPH, + "the fixed foreign peer here, so it can't also be the fanned cell", + ) + ], + peer=Adapter.LANGGRAPH, + prompt=REPLY_PROMPT, ) - - # A boots fresh under its own identity — no in-memory history — and is asked what the - # other participant told it. A correct recall can only come from the platform - # rehydrating B's (foreign-framework) message into A's context on bootstrap. - async with cell.run_as(recaller), reply_capture(room_id) as capture: - mark = capture.messages.snapshot() # scope strictly to the recall turn - mid = await user_ops.send_message( - room_id, - RECALL_TOKEN_REQUEST, - mention_id=recaller.id, - mention_name=recaller.name, + @pytest.mark.timeout( + extra=300 + ) # peer boot + relay turn + fresh A boot + recall turn + @pytest.mark.asyncio(loop_scope="session") + async def test_rehydrates_foreign_peer_message( + self, + cell: AdapterCell, + peer: AdapterCell, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + baseline_settings: BaselineSettings, + ) -> None: + await rehydrate_foreign_peer( + cell, peer, resource_manager, user_ops, reply_capture, baseline_settings ) - replies = await capture.wait_for_reply(mid, recaller.id, since=mark) - replies.assert_contains_exact(marker) diff --git a/tests/e2e/baseline/smoke/matrix/test_strands_rehydration.py b/tests/e2e/baseline/smoke/matrix/test_strands_rehydration.py new file mode 100644 index 000000000..4797e85a2 --- /dev/null +++ b/tests/e2e/baseline/smoke/matrix/test_strands_rehydration.py @@ -0,0 +1,32 @@ +"""A cold adapter recalls a message authored by its LangGraph peer.""" + +from __future__ import annotations + +import pytest + +from tests.e2e.baseline.agents import Adapter, Lane, lane, per_adapter +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.smoke.samples.rehydration import rehydrate_foreign_peer +from tests.e2e.baseline.smoke.samples.sample_agents import REPLY_PROMPT +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import AdapterCell, ResourceManager +from tests.e2e.baseline.toolkit.user_ops import UserOps + + +class TestStrandsForeignPeerRehydration: + @lane(Lane.STRANDS) + @per_adapter(Adapter.STRANDS, peer=Adapter.LANGGRAPH, prompt=REPLY_PROMPT) + @pytest.mark.timeout(extra=300) + @pytest.mark.asyncio(loop_scope="session") + async def test_rehydrates_foreign_peer_message( + self, + cell: AdapterCell, + peer: AdapterCell, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + baseline_settings: BaselineSettings, + ) -> None: + await rehydrate_foreign_peer( + cell, peer, resource_manager, user_ops, reply_capture, baseline_settings + ) diff --git a/tests/e2e/baseline/smoke/samples/provider.py b/tests/e2e/baseline/smoke/samples/provider.py new file mode 100644 index 000000000..7f60ddeee --- /dev/null +++ b/tests/e2e/baseline/smoke/samples/provider.py @@ -0,0 +1,11 @@ +"""Input for a provider tool round trip.""" + +from __future__ import annotations + +from pydantic import BaseModel + + +class RecordInput(BaseModel): + """Record a note.""" + + note: str diff --git a/tests/e2e/baseline/smoke/samples/rehydration.py b/tests/e2e/baseline/smoke/samples/rehydration.py new file mode 100644 index 000000000..be0f60cbf --- /dev/null +++ b/tests/e2e/baseline/smoke/samples/rehydration.py @@ -0,0 +1,94 @@ +"""Foreign-framework context recall scenario shared across execution lanes.""" + +from __future__ import annotations + +from tests.e2e.baseline.settings import BaselineSettings +from tests.e2e.baseline.smoke.samples.sample_agents import REPLY_PROMPT, unique_marker +from tests.e2e.baseline.toolkit.capture import CaptureFactory +from tests.e2e.baseline.toolkit.provisioning import ( + AdapterCell, + ProvisionedAgent, + ResourceManager, + agent_rest_client, +) +from tests.e2e.baseline.toolkit.user_ops import UserOps + +# Never names the token, so A can only answer from rehydrated context. +RECALL_TOKEN_REQUEST = ( + "Earlier the other participant sent you a short note with a token. " + "Call band_send_message to reply with exactly that complete token string " + "and nothing else." +) + + +def _relay_prompt(target: ProvisionedAgent, marker: str) -> str: + """A prompt that drives B to send one message mentioning A and carrying the marker.""" + return ( + REPLY_PROMPT + f" When asked, send exactly one message that mentions the " + f"participant '{target.name}' and contains this exact token: {marker}. Address " + "it to them and include nothing else of substance." + ) + + +async def rehydrate_foreign_peer( + cell: AdapterCell, + peer: AdapterCell, + resource_manager: ResourceManager, + user_ops: UserOps, + reply_capture: CaptureFactory, + baseline_settings: BaselineSettings, +) -> None: + """A recalls a marker a *different-framework* peer stated, via agent-scoped ``/context``. + + Requests ``cell`` (A's lifecycle) and ``peer`` (B, a different framework). B authors a + message mentioning A that carries the marker (so it enters A's agent-scoped context), + then stops; A cold-boots and must recall the marker from bootstrap rehydration. The + per-cell ``@requires`` gate (folded with the peer's) rides on the parametrization. + """ + marker = unique_marker("note") + recaller = await cell.provision(label=f"recaller-{cell.adapter_id}") + speaker = await peer.provision(label=f"speaker-{peer.adapter_id}") + room_id = await resource_manager.provision_room( + title=f"e2e-xframework-{cell.adapter_id}", + participants=[recaller.id, speaker.id], + ) + + # B (a different framework) authors one message that mentions A and carries the + # marker, then stops. Mentioning A is what lands it in A's agent-scoped /context. + async with ( + peer.run_as(speaker, prompt=_relay_prompt(recaller, marker)), + reply_capture(room_id) as capture, + ): + probe = capture.messages.snapshot() + mid = await user_ops.send_message( + room_id, + f"Please pass a note to {recaller.name}.", + mention_id=speaker.id, + mention_name=speaker.name, + ) + replies = await capture.wait_for_reply(mid, speaker.id, since=probe) + # Setup precondition (fail loud): B's marker-bearing message must actually + # mention A — else it never reaches A's context and a later recall miss would + # look like a rehydration bug rather than a setup failure. + replies.mentioning(recaller.id).assert_contains_any([marker]) + + context = await agent_rest_client( + recaller, baseline_settings + ).agent_api_context.get_agent_chat_context(chat_id=room_id) + assert any(marker in (item.content or "") for item in context.data or []), ( + f"agent-scoped bootstrap context lost the exact foreign token {marker!r}" + ) + + # A boots fresh under its own identity — no in-memory history — and is asked what the + # other participant told it. A correct recall can only come from the platform + # rehydrating B's (foreign-framework) message into A's context on bootstrap. + async with cell.run_as(recaller), reply_capture(room_id) as capture: + mark = capture.messages.snapshot() # scope strictly to the recall turn + mid = await user_ops.send_message( + room_id, + RECALL_TOKEN_REQUEST, + mention_id=recaller.id, + mention_name=recaller.name, + ) + replies = await capture.wait_for_reply(mid, recaller.id, since=mark) + replies.assert_contains_exact(marker) diff --git a/tests/e2e/baseline/toolkit/builders.py b/tests/e2e/baseline/toolkit/builders.py index 647ed3c92..186ad83d2 100644 --- a/tests/e2e/baseline/toolkit/builders.py +++ b/tests/e2e/baseline/toolkit/builders.py @@ -20,7 +20,7 @@ import os import tempfile import weakref -from typing import Any +from typing import TYPE_CHECKING, Any from band import create_room_workspace_resolver from band.adapters.codex import CodexSandboxMode @@ -44,6 +44,9 @@ ) from tests.e2e.baseline.toolkit.tools import ToolSpec +if TYPE_CHECKING: + from band.adapters.copilot_sdk import CopilotSDKAdapter + # Spelled out rather than derived from the Capability enum: an adapter's # `supports` is a claim the capability-scoped matrices select on, so a newly # added capability should be a deliberate per-adapter decision, not one every @@ -123,9 +126,29 @@ def _build_copilot_sdk( features: AdapterFeatures | None, tools: list[ToolSpec] | None = None, ) -> SimpleAdapter[Any]: - # The generic matrix builder is BYOK-on-Anthropic, matching claude_sdk's model; - # ask_user / a shared client are bespoke knobs exercised by - # tests/e2e/baseline/smoke/adapters/test_copilot_sdk.py, not by this builder. + sandbox = tempfile.TemporaryDirectory(prefix="band-e2e-copilot-sdk-") + adapter = build_copilot_sdk_adapter( + s, + base_directory=copilot_home_dir(sandbox.name), + custom_section=prompt or "", + features=features, + tools=tools, + ) + weakref.finalize(adapter, sandbox.cleanup) + return adapter + + +def build_copilot_sdk_adapter( + s: BaselineSettings, + *, + base_directory: str, + custom_section: str = "Keep responses short and concise.", + client: Any | None = None, + ask_user: Any | None = None, + features: AdapterFeatures | None = None, + tools: list[ToolSpec] | None = None, +) -> CopilotSDKAdapter: + """Build BYOK sessions with a caller-owned, isolated Copilot runtime home.""" from copilot import ( # noqa: PLC0415 -- isolates the copilot_sdk extra from the other frameworks this file builds ProviderConfig, ) @@ -135,16 +158,15 @@ def _build_copilot_sdk( CopilotSDKAdapterConfig, ) - # A per-cell COPILOT_HOME, as copilot_acp gets: host hooks and extensions - # in ~/.copilot otherwise steer or deny the turn under test. - sandbox = tempfile.TemporaryDirectory(prefix="band-e2e-copilot-sdk-") - adapter = CopilotSDKAdapter( + return CopilotSDKAdapter( CopilotSDKAdapterConfig( model=s.llm_models.anthropic_model, use_logged_in_user=False, - base_directory=copilot_home_dir(sandbox.name), - custom_section=prompt or "", + base_directory=base_directory, + custom_section=custom_section, ), + client=client, + ask_user=ask_user, additional_tools=_custom_tool_defs(tools), provider=ProviderConfig( type="anthropic", @@ -153,8 +175,6 @@ def _build_copilot_sdk( ), **feature_kwargs(features), ) - weakref.finalize(adapter, sandbox.cleanup) - return adapter @adapter(Adapter.LANGGRAPH, requires=[Dep.OPENAI], supports=_EVERY_CAPABILITY) @@ -225,7 +245,9 @@ def _build_pydantic_ai( ) -@adapter(Adapter.STRANDS, requires=[Dep.OPENAI], supports=_EVERY_CAPABILITY) +@adapter( + Adapter.STRANDS, requires=[Dep.OPENAI, Dep.STRANDS], supports=_EVERY_CAPABILITY +) def _build_strands( s: BaselineSettings, *, diff --git a/tests/e2e/baseline/toolkit/ci_lanes.py b/tests/e2e/baseline/toolkit/ci_lanes.py index f6844f0eb..76942eb06 100644 --- a/tests/e2e/baseline/toolkit/ci_lanes.py +++ b/tests/e2e/baseline/toolkit/ci_lanes.py @@ -118,25 +118,27 @@ def adapter_home_lanes() -> dict[str, str]: return {str(adapter): str(cl.id) for cl in ci_lanes() for adapter in cl.adapters} -def hosting_lanes(home_lanes: frozenset[str]) -> frozenset[str]: - """CI lane ids whose ``uv`` extra can install *every* framework whose home lane is - in ``home_lanes`` — empty if none can (the frameworks need incompatible extras, e.g. - crewai + a ``dev``-extra framework); empty ``home_lanes`` → every lane. - - A lane *hosts* a framework iff they share a ``uv`` extra - (``lane_extra(lane) == lane_extra(home)``): every ``dev`` lane installs every - ``dev`` framework, and ``dev-crewai`` installs only the crewai stack. Hosting is thus - broader than — and distinct from — an adapter's single *home* lane. Conservative and - correct given crewai is the only venv conflict, and derived purely from - ``lane_extra`` + the home-lane partition (no hand-maintained table). - """ - if not home_lanes: - return known_lane_ids() - extras = {lane_extra(Lane(home)) for home in home_lanes} - if len(extras) != 1: # frameworks need incompatible extras — no lane hosts them all - return frozenset() - (extra,) = extras - return frozenset(str(cl.id) for cl in ci_lanes() if cl.extra == extra) +# Extra hosts beyond its adapters' home extras; legacy needs this foreign peer. +EXTRA_HOSTS: dict[Extra, frozenset[Adapter]] = { + Extra.DEV_STRANDS_NOOA: frozenset({Adapter.LANGGRAPH}), +} + + +def hosting_lanes(frameworks: frozenset[str]) -> frozenset[str]: + """Lanes whose installed dependencies host every requested adapter.""" + homes = adapter_home_lanes() + unknown = frameworks - homes.keys() + if unknown: + raise ValueError(f"Unknown adapter ids: {sorted(unknown)}") + return frozenset( + str(cl.id) + for cl in ci_lanes() + if all( + lane_extra(Lane(homes[framework])) == cl.extra + or framework in EXTRA_HOSTS.get(cl.extra, frozenset()) + for framework in frameworks + ) + ) # The e2e workflow (REPO_ROOT is the single source of the checkout-depth assumption). diff --git a/tests/e2e/baseline/toolkit/deps.py b/tests/e2e/baseline/toolkit/deps.py index f9ed1a7f3..94d36f996 100644 --- a/tests/e2e/baseline/toolkit/deps.py +++ b/tests/e2e/baseline/toolkit/deps.py @@ -84,6 +84,7 @@ class Lane(StrEnum): GOOGLE = "google" LETTA = "letta" NOOA = "nooa" + STRANDS = "strands" PARLANT = "parlant" @@ -103,6 +104,7 @@ class Extra(StrEnum): DEV = "dev" DEV_CREWAI = "dev-crewai" DEV_PARLANT = "dev-parlant" + DEV_STRANDS_NOOA = "dev-strands-nooa" # Lane -> the ``uv`` extra a lane's job installs. Lane id and extra are separate: @@ -124,8 +126,8 @@ class Extra(StrEnum): # (same import path, two distributions), so it needs its own extra entirely — # `dev` can no longer install parlant at all (see pyproject [tool.uv] conflicts). Lane.PARLANT: Extra.DEV_PARLANT, - # NOOA rides the ``dev`` extra, which installs it only where NOOA runs. - Lane.NOOA: Extra.DEV, + Lane.NOOA: Extra.DEV_STRANDS_NOOA, + Lane.STRANDS: Extra.DEV_STRANDS_NOOA, } @@ -140,7 +142,7 @@ class Extra(StrEnum): # (https://docs.letta.com/guides/server/source). # # NOOA imports ``fcntl`` unconditionally, so it cannot be imported on Windows and -# the ``dev`` extra does not install it there. Every other lane runs on every OS +# the ``dev-strands-nooa`` extra does not install it there. Every other lane runs on every OS # the e2e matrix offers. LINUX_ONLY_LANES: frozenset[Lane] = frozenset({Lane.LETTA, Lane.NOOA}) @@ -165,6 +167,7 @@ class Dep(Enum): OPENCODE_BASH_ASKS = "opencode_bash_asks" # that serve gates `bash` to `ask` LETTA = "letta" # a self-hosted LETTA_BASE_URL (or a Letta Cloud key) CREWAI = "crewai" # the crewai package is importable (the dev-crewai lane) + STRANDS = "strands" NOOA = "nooa" # the nooa package is importable (Python 3.12-3.13, not Windows) COPILOT_CLI = "copilot_cli" # the `copilot` CLI reachable on PATH (ACP backend) CURSOR_CLI = "cursor_cli" # the `agent` CLI and noninteractive auth for Cursor ACP @@ -421,9 +424,14 @@ def _letta_available(settings: BaselineSettings) -> bool: "crewai is not importable (install the dev-crewai lane)", lane=Lane.CREWAI, ), + Dep.STRANDS: DepSpec( + lambda _s: importlib.util.find_spec("strands") is not None, + "strands is not importable (install dev-strands-nooa)", + lane=Lane.STRANDS, + ), Dep.NOOA: DepSpec( lambda _s: importlib.util.find_spec("nooa") is not None, - "nooa is not importable (the dev extra installs it on Python 3.12-3.13, " + "nooa is not importable (dev-strands-nooa installs it on Python 3.12-3.13, " "off Windows)", lane=Lane.NOOA, ), diff --git a/tests/e2e/baseline/toolkit/logs.py b/tests/e2e/baseline/toolkit/logs.py index ec8532839..4c70fbd0a 100644 --- a/tests/e2e/baseline/toolkit/logs.py +++ b/tests/e2e/baseline/toolkit/logs.py @@ -11,11 +11,13 @@ @contextmanager -def sdk_logs_at(package: ModuleType, level: int) -> Iterator[None]: +def sdk_logs_at(package: ModuleType | str, level: int) -> Iterator[None]: """Let ``package``'s records at ``level`` reach pytest's captured log, which a failing test prints; the root logger's WARNING default otherwise drops them. Never raises the threshold, so a run at ``--log-level=DEBUG`` keeps its DEBUG.""" - sdk_logger = logging.getLogger(package.__name__) + sdk_logger = logging.getLogger( + package if isinstance(package, str) else package.__name__ + ) previous_level = sdk_logger.level sdk_logger.setLevel(more_verbose(level, sdk_logger.getEffectiveLevel())) try: diff --git a/tests/framework_configs/adapters.py b/tests/framework_configs/adapters.py index 5d838509d..50352a3dc 100644 --- a/tests/framework_configs/adapters.py +++ b/tests/framework_configs/adapters.py @@ -44,7 +44,8 @@ from band.integrations.crewai.tools import NoopReporter, build_band_crewai_tools from tests.framework_configs.sentinel import MISSING, STRICT_CI, MissingSentinel -# NOOA supports Python 3.12 and 3.13 on POSIX only, so the dev extra skips it elsewhere. +# Legacy dependencies are intentionally absent from modern dev. +_HAS_STRANDS = importlib.util.find_spec("strands") is not None _HAS_NOOA = importlib.util.find_spec("nooa") is not None __all__ = [ @@ -590,7 +591,9 @@ def _build_pydantic_ai_config() -> AdapterConfig: ) -def _build_strands_config() -> AdapterConfig: +def _build_strands_config() -> AdapterConfig | None: + if not _HAS_STRANDS: + return None from band.adapters.strands import ( # noqa: PLC0415 -- isolates the strands extra from the other frameworks this file configures StrandsAdapterConfig, ) @@ -821,6 +824,8 @@ def _build_gemini_config() -> AdapterConfig: _excluded = _excluded | {"claude_sdk"} if not _HAS_COPILOT_SDK: _excluded = _excluded | {"copilot_sdk"} +if not _HAS_STRANDS: + _excluded = _excluded | {"strands"} if not _HAS_NOOA: _excluded = _excluded | {"nooa"} ADAPTER_EXCLUDED_MODULES: frozenset[str] = frozenset(_excluded) diff --git a/tests/framework_configs/converters.py b/tests/framework_configs/converters.py index 87f103f5a..98b85b956 100644 --- a/tests/framework_configs/converters.py +++ b/tests/framework_configs/converters.py @@ -8,6 +8,7 @@ from __future__ import annotations import functools +import importlib.util import logging from collections.abc import Callable from dataclasses import dataclass @@ -42,6 +43,8 @@ ) from tests.framework_configs.sentinel import STRICT_CI +_HAS_STRANDS = importlib.util.find_spec("strands") is not None + __all__ = [ "CONVERTER_CONFIGS", "CONVERTER_EXCLUDED_MODULES", @@ -339,6 +342,9 @@ def _build_gemini_config() -> ConverterConfig: } ) +if not _HAS_STRANDS: + CONVERTER_EXCLUDED_MODULES |= {"strands"} + def _build_google_adk_config() -> ConverterConfig: return ConverterConfig( @@ -356,7 +362,9 @@ def _build_google_adk_config() -> ConverterConfig: ) -def _build_strands_config() -> ConverterConfig: +def _build_strands_config() -> ConverterConfig | None: + if not _HAS_STRANDS: + return None return ConverterConfig( framework_id="strands", display_name="Strands", @@ -389,7 +397,7 @@ def _build_nooa_config() -> ConverterConfig: ) -_CONVERTER_CONFIG_BUILDERS: list[Callable[[], ConverterConfig]] = [ +_CONVERTER_CONFIG_BUILDERS: list[Callable[[], ConverterConfig | None]] = [ _build_anthropic_config, _build_langchain_config, _build_crewai_config, @@ -417,7 +425,9 @@ def _build_converter_configs() -> list[ConverterConfig]: configs: list[ConverterConfig] = [] for builder in _CONVERTER_CONFIG_BUILDERS: try: - configs.append(builder()) + result = builder() + if result is not None: + configs.append(result) except Exception as exc: if STRICT_CI: raise RuntimeError( diff --git a/tests/framework_conformance/imageprobes.py b/tests/framework_conformance/imageprobes.py new file mode 100644 index 000000000..f70c82dc1 --- /dev/null +++ b/tests/framework_conformance/imageprobes.py @@ -0,0 +1,436 @@ +"""Live matrix proving each IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS entry +actually passes an image band_read_room_file result through as real +vision/image content -- not just that the bookkeeping constant lists it. + +Each probe drives the framework's real tool-dispatch code path with a fake +tools object whose read_room_file returns the exact MCP-image-content shape +AgentTools.read_room_file produces for a small previewable image, and asserts +the framework's own outgoing tool-result shape is a real image block rather +than a json.dumps'd text blob. Deeper framework-specific coverage (the +non-image degrade-to-text path, error handling, custom-tool interaction) +stays in each framework's own test file -- this matrix exists to answer one +question, uniformly, for every framework that claims support: does a real +image actually get through. + +To add a framework here: write a probe, add it to IMAGE_PASSTHROUGH_PROBES, +and add the framework_id to IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS in +test_adapter_conformance.py -- test_probe_registry_matches_supported_framework_ids +fails loudly if the two ever name different frameworks. +""" + +from __future__ import annotations + +import base64 +import importlib.util +from collections.abc import Awaitable, Callable, Iterable +from types import SimpleNamespace +from typing import Any +from unittest.mock import AsyncMock, MagicMock + +import pytest + +from band.core.types import AdapterFeatures, Capability +from band.integrations.mcp import BandMCPTransport +from band.runtime.tools import TOOL_DEFINITIONS, TOOL_MODELS, BandTool, ToolCallOutcome + +try: + import crewai # noqa: F401 + + _CREWAI_AVAILABLE = True +except ImportError: + _CREWAI_AVAILABLE = False + +try: + import pydantic_ai # noqa: F401 + + _PYDANTIC_AI_AVAILABLE = True +except ImportError: + _PYDANTIC_AI_AVAILABLE = False + +try: + import nooa # noqa: F401 + + _NOOA_AVAILABLE = True +except ImportError: + _NOOA_AVAILABLE = False + +# crewai and pydantic-ai aren't both installed in every lane's venv (a +# three-way conflict group with parlant -- see `conflicts` in pyproject.toml): +# dev-crewai lacks pydantic-ai, dev-parlant lacks both. These framework_ids +# need a per-lane skip the other probes (all in every lane's `dev` baseline) +# don't. +_SOMETIMES_MISSING: dict[str, bool] = { + "crewai": _CREWAI_AVAILABLE, + "crewai_flow": _CREWAI_AVAILABLE, + "pydantic_ai": _PYDANTIC_AI_AVAILABLE, + # NOOA supports Python 3.12 and 3.13 on POSIX only. + "nooa": _NOOA_AVAILABLE, + "strands": importlib.util.find_spec("strands") is not None, +} + +_IMAGE_RESULT: dict[str, Any] = { + "content": [{"type": "image", "data": "ZmFrZQ==", "mimeType": "image/png"}] +} + +# Derived, never re-typed: a probe asserting on a hand-written "ZmFrZQ==" would +# still pass if _IMAGE_RESULT changed underneath it. +_EXPECTED_BASE64: str = _IMAGE_RESULT["content"][0]["data"] +_EXPECTED_MIME_TYPE: str = _IMAGE_RESULT["content"][0]["mimeType"] +_EXPECTED_BYTES: bytes = base64.b64decode(_EXPECTED_BASE64) + + +def _is_expected_image(data: bytes | str, mime_type: str) -> bool: + """Whether a framework's outgoing image block carries the probe's image. + + ``data`` arrives in whichever encoding that framework's SDK uses, so a + probe passes what it found rather than normalising first. + """ + expected = _EXPECTED_BYTES if isinstance(data, bytes) else _EXPECTED_BASE64 + return data == expected and mime_type == _EXPECTED_MIME_TYPE + + +def _tool_named(tools: Iterable[Any], name: str) -> Any: + """The one tool a framework built for ``name``.""" + return next(tool for tool in tools if tool.name == name) + + +class ReadRoomFileTools: + """Minimal AgentToolsProtocol double whose read_room_file/execute_tool_call + always return the fixed image result -- only what each probe's dispatch + path calls (MCP-based probes call read_room_file; generic-dispatch probes + like agno call execute_tool_call).""" + + async def read_room_file(self, file_id: str) -> dict[str, Any]: + del file_id + return _IMAGE_RESULT + + async def execute_tool_call( + self, tool_name: str, arguments: dict[str, Any] + ) -> dict[str, Any]: + del tool_name, arguments + return _IMAGE_RESULT + + +async def _probe_claude_sdk() -> bool: + """claude_sdk's tools are its room-bound Band MCP backend, dialed over HTTP.""" + from tests.mcpclient import ( # noqa: PLC0415 -- imports mcp, a claude_sdk extra absent from the standard dev-crewai/dev-parlant lane venvs + mcp_session, + started_backend, + ) + + async with ( + started_backend( + room_bound=True, + tool_definitions=[TOOL_DEFINITIONS[BandTool.READ_ROOM_FILE]], + get_tools={"room-1": ReadRoomFileTools()}.get, + ) as backend, + mcp_session(backend.endpoint(BandMCPTransport.HTTP, "room-1")) as session, + ): + result = await session.call_tool(BandTool.READ_ROOM_FILE, {"file_id": "file-1"}) + + blocks = [block.model_dump(exclude_none=True) for block in result.content] + return not result.isError and {"content": blocks} == _IMAGE_RESULT + + +async def _probe_anthropic() -> bool: + + from anthropic.types import ( # noqa: PLC0415 -- anthropic extra, absent from the standard dev-crewai/dev-parlant lane venvs + ToolUseBlock, + ) + + from band.adapters.anthropic import ( # noqa: PLC0415 -- anthropic extra, absent from the standard dev-crewai/dev-parlant lane venvs + AnthropicAdapter, + ) + + adapter = AnthropicAdapter(emit=()) + tools = MagicMock() + tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) + response = MagicMock() + response.content = [ + ToolUseBlock( + type="tool_use", + id="tool-1", + name=BandTool.READ_ROOM_FILE, + input={"file_id": "file-1"}, + ) + ] + + results = await adapter._process_tool_calls(response, tools) + + content = results[0]["content"] + if not isinstance(content, list) or len(content) != 1: + return False + block = content[0] + return block["type"] == "image" and _is_expected_image( + block["source"]["data"], block["source"]["media_type"] + ) + + +async def _probe_opencode() -> bool: + from mcp.shared.memory import ( # noqa: PLC0415 -- opencode extra, absent from the standard dev-crewai/dev-parlant lane venvs + create_connected_server_and_client_session, + ) + + from band.integrations.mcp.engine import ( # noqa: PLC0415 -- opencode extra, absent from the standard dev-crewai/dev-parlant lane venvs + EmbeddedResolver, + EngineSpec, + build_engine, + build_tool_registration, + extend_with_chat_id, + ) + + resolver = EmbeddedResolver(get_tools=lambda _chat_id: ReadRoomFileTools()) + definition = TOOL_DEFINITIONS[BandTool.READ_ROOM_FILE] + registration = build_tool_registration( + definition, + extend_with_chat_id(definition.input_model, None), + resolver=resolver, + strip_chat_id=True, + ) + mcp = build_engine(EngineSpec(name="probe-opencode", tools=(registration,))) + + async with create_connected_server_and_client_session(mcp) as session: + result = await session.call_tool( + BandTool.READ_ROOM_FILE, {"chat_id": "room-1", "file_id": "file-1"} + ) + + if result.isError or len(result.content) != 1: + return False + block = result.content[0] + return block.type == "image" and _is_expected_image(block.data, block.mimeType) + + +async def _probe_gemini() -> bool: + + from google.genai import ( # noqa: PLC0415 -- gemini extra, absent from the standard dev-crewai/dev-parlant lane venvs + types, + ) + + from band.adapters.gemini import ( # noqa: PLC0415 -- gemini extra, absent from the standard dev-crewai/dev-parlant lane venvs + GeminiAdapter, + ) + + adapter = GeminiAdapter() + tools = MagicMock() + tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) + function_calls = [ + types.FunctionCall( + name=BandTool.READ_ROOM_FILE, args={"file_id": "file-1"}, id="c1" + ) + ] + + parts = await adapter._process_function_calls(function_calls, tools) + + function_response = parts[0].function_response + if function_response is None or not function_response.parts: + return False + inline_data = function_response.parts[0].inline_data + return inline_data is not None and _is_expected_image( + inline_data.data, inline_data.mime_type + ) + + +async def _probe_langgraph() -> bool: + + from band.integrations.langgraph.langchain_tools import ( # noqa: PLC0415 -- langgraph extra, absent from the standard dev-crewai/dev-parlant lane venvs + agent_tools_to_langchain, + ) + + tools = MagicMock() + tools.is_hub_room = False + tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) + wrapped = { + tool.name: tool + for tool in agent_tools_to_langchain( + tools, + features=AdapterFeatures(capabilities=frozenset({Capability.FILES})), + ) + } + + result = await wrapped[BandTool.READ_ROOM_FILE].ainvoke({"file_id": "file-1"}) + + if not isinstance(result, list) or len(result) != 1: + return False + block = result[0] + return block["type"] == "image" and _is_expected_image( + block["base64"], block["mime_type"] + ) + + +async def _probe_agno() -> bool: + from agno.tools.function import ( # noqa: PLC0415 -- agno extra, absent from the standard dev-crewai/dev-parlant lane venvs + ToolResult, + ) + + from band.adapters.agno import ( # noqa: PLC0415 -- agno extra, absent from the standard dev-crewai/dev-parlant lane venvs + _bind_room_tools, + _make_band_entrypoint, + ) + + entry = _make_band_entrypoint(BandTool.READ_ROOM_FILE) + with _bind_room_tools(ReadRoomFileTools()): + result = await entry(file_id="file-1") + + if not isinstance(result, ToolResult) or not result.images: + return False + image = result.images[0] + return len(result.images) == 1 and _is_expected_image( + image.content, image.mime_type + ) + + +async def _probe_strands() -> bool: + from band.adapters.strands import ( # noqa: PLC0415 -- strands extra, absent from the standard dev-crewai/dev-parlant lane venvs + _tool_result, + ) + + tool_use = {"toolUseId": "t1", "name": BandTool.READ_ROOM_FILE, "input": {}} + + result = _tool_result(tool_use, value=_IMAGE_RESULT, ok=True) + + # Strands names the format bare ("png"), not as a mime type. + expected_format = _EXPECTED_MIME_TYPE.removeprefix("image/") + return result["content"] == [ + {"image": {"format": expected_format, "source": {"bytes": _EXPECTED_BYTES}}} + ] + + +async def _probe_nooa() -> bool: + from band.adapters.nooa.tools import ( # noqa: PLC0415 -- nooa extra, absent outside Python 3.12-3.13 on POSIX + RoomToolSpec, + room_tools_class, + ) + + async def read(tools: Any, arguments: dict[str, Any]) -> object: + return _IMAGE_RESULT + + spec = RoomToolSpec( + BandTool.READ_ROOM_FILE, TOOL_MODELS[BandTool.READ_ROOM_FILE], read + ) + room = room_tools_class([spec])(emit_tool_calls=False) + async with room.bound_to(MagicMock()): + result = await getattr(room, BandTool.READ_ROOM_FILE)(file_id="f1") + + [image] = result + return image.modality == "image" and _is_expected_image( + image._base64_data(), image.media_type + ) + + +async def _probe_copilot_sdk() -> bool: + + from copilot import ( # noqa: PLC0415 -- copilot_sdk extra, absent from the standard dev-crewai/dev-parlant lane venvs + ToolInvocation, + ) + + from band.adapters.copilot_sdk import ( # noqa: PLC0415 -- copilot_sdk extra, absent from the standard dev-crewai/dev-parlant lane venvs + CopilotSDKAdapter, + ) + + room_tools = MagicMock() + room_tools.execute_tool_call_structured = AsyncMock( + return_value=ToolCallOutcome(value=_IMAGE_RESULT, ok=True) + ) + adapter = CopilotSDKAdapter.__new__(CopilotSDKAdapter) + adapter.features = SimpleNamespace(emit=()) + adapter._custom_tools = [] + adapter._custom_effects = {} + adapter._turn_state = {} + adapter._room_tools = {"room-1": room_tools} + + result = await adapter._execute_bridged_tool( + "room-1", + ToolInvocation( + tool_call_id="c1", tool_name=BandTool.READ_ROOM_FILE, arguments={} + ), + ) + + binary = result.binary_results_for_llm + if not binary or len(binary) != 1: + return False + return binary[0].type == "image" and _is_expected_image( + binary[0].data, binary[0].mime_type + ) + + +async def _probe_codex() -> bool: + from band.adapters.codex import ( # noqa: PLC0415 -- codex extra, absent from the standard dev-crewai/dev-parlant lane venvs + _image_content_items, + ) + + content_items = _image_content_items(_IMAGE_RESULT) + + data_uri = f"data:{_EXPECTED_MIME_TYPE};base64,{_EXPECTED_BASE64}" + return content_items == [{"type": "inputImage", "imageUrl": data_uri}] + + +async def _probe_pydantic_ai() -> bool: + from band.adapters.pydantic_ai import ( # noqa: PLC0415 -- pydantic_ai extra, absent from the standard dev-crewai/dev-parlant lane venvs + PydanticAIAdapter, + PydanticAIAdapterConfig, + ) + + adapter = PydanticAIAdapter( + PydanticAIAdapterConfig(model="test"), capabilities=Capability.FILES + ) + await adapter.on_started(agent_name="Probe", agent_description="probe") + read_room_file = adapter._agent._function_toolset.tools[BandTool.READ_ROOM_FILE] + + result = await read_room_file.function( + SimpleNamespace(deps=ReadRoomFileTools(), tool_call_id="probe"), + file_id="file-1", + ) + + if not isinstance(result, list) or len(result) != 1: + return False + binary = result[0] + return _is_expected_image(binary.data, binary.media_type) + + +async def _probe_crewai() -> bool: + from band.integrations.crewai.tools import ( # noqa: PLC0415 -- crewai extra, absent from the standard dev-crewai/dev-parlant lane venvs + CrewAIToolContext, + NoopReporter, + build_band_crewai_tools, + vision_sentinel, + ) + + context = CrewAIToolContext(room_id="room-1", tools=ReadRoomFileTools()) + tools = build_band_crewai_tools( + get_context=lambda: context, + reporter=NoopReporter(), + capabilities=frozenset({Capability.FILES}), + ) + read_room_file = _tool_named(tools, BandTool.READ_ROOM_FILE) + + result = read_room_file._run(file_id="file-1") + + return result == vision_sentinel(_IMAGE_RESULT) + + +IMAGE_PASSTHROUGH_PROBES: dict[str, Callable[[], Awaitable[bool]]] = { + "claude_sdk": _probe_claude_sdk, + "anthropic": _probe_anthropic, + "opencode": _probe_opencode, + "gemini": _probe_gemini, + "langgraph": _probe_langgraph, + "agno": _probe_agno, + "strands": _probe_strands, + "nooa": _probe_nooa, + "copilot_sdk": _probe_copilot_sdk, + "codex": _probe_codex, + "pydantic_ai": _probe_pydantic_ai, + "crewai": _probe_crewai, + # crewai_flow shares integrations/crewai/tools.py with crewai -- same probe. + "crewai_flow": _probe_crewai, +} + + +def _framework_param(framework_id: str) -> Any: + available = _SOMETIMES_MISSING.get(framework_id, True) + return pytest.param( + framework_id, + marks=pytest.mark.skipif( + not available, reason=f"{framework_id} not installed in this venv" + ), + ) diff --git a/tests/framework_conformance/lanekit.py b/tests/framework_conformance/lanekit.py new file mode 100644 index 000000000..0e7e34bfa --- /dev/null +++ b/tests/framework_conformance/lanekit.py @@ -0,0 +1,66 @@ +"""Pytest item doubles for baseline lane-scheduling guards.""" + +from __future__ import annotations + +from types import SimpleNamespace + +import pytest + +from tests.e2e.baseline.agents import ( + LANE_MARKER, + PER_ADAPTER_MARKER, + WITH_ADAPTERS_MARKER, + Adapter, + Lane, + PerAdapter, + WithAdapters, +) +from tests.e2e.baseline.toolkit.ci_lanes import ci_lanes + + +class FakeItem: + """Minimal ``pytest.Item`` stand-in for the collection hooks. + + Models only what ``item_frameworks`` / ``_override_lane`` read (callspec params, + the per-adapter / with-adapters / lane markers) and records ``add_marker`` skips so + a test can assert whether ``apply_lane_skips`` skipped it. + """ + + def __init__( + self, + nodeid: str, + *, + agents: tuple[Adapter, ...] | None = None, + adapter_id: str | None = None, + peer: Adapter | None = None, + assigned_lane: Lane | None = None, + ) -> None: + self.nodeid = nodeid + self._markers: dict[str, SimpleNamespace] = {} + self._added: list[object] = [] + if agents is not None: + req = WithAdapters(adapters=agents, prompt=None, features=None, tools=None) + self._markers[WITH_ADAPTERS_MARKER] = SimpleNamespace(args=(req,)) + if adapter_id is not None: + self.callspec = SimpleNamespace(params={"adapter_id": adapter_id}) + build = PerAdapter(prompt=None, features=None, tools=None, peer=peer) + self._markers[PER_ADAPTER_MARKER] = SimpleNamespace(args=(build,)) + if assigned_lane is not None: + self._markers[LANE_MARKER] = SimpleNamespace(args=(assigned_lane,)) + + def get_closest_marker(self, name: str) -> SimpleNamespace | None: + return self._markers.get(name) + + def add_marker(self, marker: object) -> None: + self._added.append(marker) + + @property + def skipped(self) -> bool: + return any(getattr(m, "name", None) == "skip" for m in self._added) + + +def _two_adapters_in_different_lanes() -> tuple[Adapter, Adapter]: + populated = [lane for lane in ci_lanes() if lane.adapters] + if len(populated) < 2: + pytest.skip("need >=2 populated CI lanes to exercise the schedulability guard") + return populated[0].adapters[0], populated[1].adapters[0] diff --git a/tests/framework_conformance/outcomeprobes.py b/tests/framework_conformance/outcomeprobes.py new file mode 100644 index 000000000..cfe8d896d --- /dev/null +++ b/tests/framework_conformance/outcomeprobes.py @@ -0,0 +1,150 @@ +"""Every judged adapter's turn ends with core's verdict, not its own. + +Each probe (see ``turnprobes``) drives one scripted turn through the adapter's +real ``on_event``. A turn that replied, declined, did real work or was settled +by the adapter completes silently; a turn that did nothing is reported once +with core's missing-reply text and raised as ``TurnResultAlreadyReported``, so +the runtime marks it FAILED. The relaying adapters post the model's final text +unless a tool already replied; the rest discard it. + +To add an adapter: write its probe in ``turnprobes/.py`` and register it +in ``TURN_OUTCOME_PROBES``. ``test_every_judged_adapter_has_a_probe`` fails +when a judged adapter has none. +""" + +from __future__ import annotations + +import importlib +import inspect +import pkgutil +from dataclasses import dataclass + +from band_sdk_core import TurnVerdict + +import band +from band.core.protocols import TurnResultAlreadyReported +from band.core.simple_adapter import SimpleAdapter +from band.runtime.tools import BandTool +from band.testing import failure_reports +from band.testing.fake_tools import FakeAgentTools +from tests.framework_conformance.turnprobes import ( + ToolCall, + TurnOutcomeProbe, + TurnScript, + acp, + claudesdk, + codex, + copilotsdk, + crewai, + letta, + opencode, + toolloop, + turn_tools, +) + +TURN_OUTCOME_PROBES: dict[str, TurnOutcomeProbe] = { + **acp.PROBES, + **claudesdk.PROBES, + **codex.PROBES, + **copilotsdk.PROBES, + **crewai.PROBES, + **letta.PROBES, + **opencode.PROBES, + **toolloop.PROBES, +} + +ANSWER = "The vault code is 4471-ECHO." +REPLY = ToolCall(BandTool.SEND_MESSAGE, {"content": ANSWER, "mentions": ["@alice"]}) + + +@dataclass(frozen=True) +class TurnResult: + verdict: TurnVerdict + messages: list[str] + failures: list[tuple[str, str]] + + +async def run_turn(probe: TurnOutcomeProbe, script: TurnScript) -> TurnResult: + tools = turn_tools() + try: + await probe.run(script, tools) + verdict = TurnVerdict.Complete + except TurnResultAlreadyReported: + verdict = TurnVerdict.MissingReply + return observed(tools, verdict) + + +def observed(tools: FakeAgentTools, verdict: TurnVerdict) -> TurnResult: + return TurnResult( + verdict=verdict, + messages=tools.chat, + failures=failure_reports(tools), + ) + + +COMPLETING_SCRIPTS = { + "decline": TurnScript((ToolCall(BandTool.NO_REPLY, {"reason": "FYI only"}),)), + "reply": TurnScript((REPLY,)), + "act": TurnScript((ToolCall(BandTool.CREATE_CHATROOM),)), +} + + +def probe_params() -> list[str]: + return sorted(TURN_OUTCOME_PROBES) + + +def relaying_probe_params() -> list[str]: + return [name for name in probe_params() if TURN_OUTCOME_PROBES[name].relays] + + +#: Registered adapters whose turns are not the model's to answer through Band tools. +UNJUDGED_FRAMEWORK_IDS = frozenset({"crewai_flow", "parlant"}) + + +#: Judged adapters outside ADAPTER_CONFIGS, by the probe that runs their rows. +#: A subclass that inherits one of these ``on_message`` methods is covered too. +PROBED_OUTSIDE_CONFIGS = {"ACPClientAdapter": "acp", "CursorACPAdapter": "cursor_acp"} + +#: Adapters outside ADAPTER_CONFIGS whose verdict their own tests pin. +PINNED_OUTSIDE_CONFIGS = { + "SlackAdapter": "its brain's verdict (tests/integrations/slack)", + "A2AAdapter": "unjudged (tests/integrations/a2a)", + "A2AGatewayAdapter": "unjudged (tests/integrations/a2a/gateway)", + "BandACPServerAdapter": "unjudged (tests/integrations/acp)", +} + + +def band_adapters() -> dict[str, type[SimpleAdapter]]: + """Every concrete SimpleAdapter defined in band whose module imports here.""" + for module in pkgutil.walk_packages(band.__path__, "band."): + if module.name.endswith("__main__"): + continue + try: + importlib.import_module(module.name) + except ImportError as error: + missing = ( + error if isinstance(error, ModuleNotFoundError) else error.__cause__ + ) + if not isinstance(missing, ModuleNotFoundError) or ( + missing.name or "" + ).startswith("band"): + raise + continue # an absent optional package is covered by its owning lane + pending, adapters = [SimpleAdapter], {} + while pending: + for cls in pending.pop().__subclasses__(): + pending.append(cls) + if cls.__module__.startswith("band.") and not inspect.isabstract(cls): + adapters[cls.__name__] = cls + return adapters + + +def probe_running( + cls: type[SimpleAdapter], adapters: dict[str, type[SimpleAdapter]] +) -> str | None: + """The probe that runs ``cls``'s turn, via the ``on_message`` it uses.""" + for name, probe in PROBED_OUTSIDE_CONFIGS.items(): + owner = adapters.get(name) + if owner and issubclass(cls, owner) and cls.on_message is owner.on_message: + return probe + return None diff --git a/tests/framework_conformance/scorecardkit.py b/tests/framework_conformance/scorecardkit.py new file mode 100644 index 000000000..8142437e4 --- /dev/null +++ b/tests/framework_conformance/scorecardkit.py @@ -0,0 +1,84 @@ +"""Pytest marker, item, and report doubles for scorecard guards.""" + +from __future__ import annotations + +from types import SimpleNamespace + +from tests.e2e.baseline.agents import ( + LANE_MARKER, + PER_ADAPTER_MARKER, + ExcludedAdapter, + PerAdapter, +) +from tests.e2e.baseline.toolkit.ci_lanes import ci_lanes + + +def _per_adapter_marker(fn: object) -> PerAdapter: + """The ``PerAdapter`` payload a decorated function carries.""" + for mark in fn.pytestmark: # type: ignore[attr-defined] + if mark.name == PER_ADAPTER_MARKER: + return mark.args[0] + raise AssertionError("no per_adapter marker on the decorated function") + + +def _parametrized_adapter_ids(fn: object) -> list[str]: + for mark in fn.pytestmark: # type: ignore[attr-defined] + if mark.name == "parametrize": + return [param.id for param in mark.args[1]] + raise AssertionError("no parametrize marker on the decorated function") + + +class ScorecardItem: + """A ``pytest.Item`` stand-in exposing only what ``na_rows`` reads.""" + + def __init__(self, nodeid: str, exclude: tuple[ExcludedAdapter, ...] = ()) -> None: + self.nodeid = nodeid + build = PerAdapter(prompt=None, features=None, tools=None, exclude=exclude) + self._marker = SimpleNamespace(args=(build,)) + + def get_closest_marker(self, name: str) -> object | None: + return self._marker if name == PER_ADAPTER_MARKER else None + + +def _report( + nodeid: str, + when: str, + *, + outcome: str, + reason: str | None = None, + keywords: tuple[str, ...] = (), +) -> object: + longrepr = ("m.py", 1, f"Skipped: {reason}") if reason is not None else None + return SimpleNamespace( + nodeid=nodeid, + when=when, + skipped=outcome == "skipped", + failed=outcome == "failed", + passed=outcome == "passed", + longrepr=longrepr, + keywords=frozenset(keywords), + ) + + +# Two distinct lanes with at least one adapter each, read off the real registry rather +# than hand-picked ids — a gate case only needs "two different homes", not which ones. +_LANE_A, _LANE_B = [lane for lane in ci_lanes() if lane.adapters][:2] +_ADAPTER_A = str(_LANE_A.adapters[0]) +_ADAPTER_B = str(_LANE_B.adapters[0]) + + +class FakeMatrixItem: + """A ``pytest.Item`` stand-in exposing what ``lane_selection.expected_lane`` reads: + its ``adapter_id`` callspec param and an optional ``@lane`` override marker.""" + + def __init__( + self, nodeid: str, adapter: str, override_lane: str | None = None + ) -> None: + self.nodeid = nodeid + self.callspec = SimpleNamespace(params={"adapter_id": adapter}) + self._override = override_lane + + def get_closest_marker(self, name: str) -> object | None: + if name == LANE_MARKER and self._override is not None: + return SimpleNamespace(args=(self._override,)) + return None diff --git a/tests/framework_conformance/test_collected_coverage.py b/tests/framework_conformance/test_collected_coverage.py new file mode 100644 index 000000000..8c416952c --- /dev/null +++ b/tests/framework_conformance/test_collected_coverage.py @@ -0,0 +1,41 @@ +"""Collection coverage follows pytest's actual keyword selection and framework bindings.""" + +from __future__ import annotations + +from pathlib import Path + +from tests.framework_conformance.venv_job_coverage import ( + collected_nodes, + selected_nodes, +) + + +class TestCollectedCoverage: + def test_keyword_filter_does_not_cover_an_explicitly_named_file( + self, tmp_path: Path + ) -> None: + test = tmp_path / "test_selection.py" + test.write_text( + "class TestSelection:\n" + " def test_retained(self): pass\n" + " def test_omitted(self): pass\n" + ) + full = selected_nodes([str(test)]) + selected = selected_nodes([str(test), "-k", "retained"]) + assert {node.rsplit("::", 1)[1] for node in full - selected} == {"test_omitted"} + + def test_framework_binding_does_not_depend_on_the_test_name( + self, tmp_path: Path + ) -> None: + test = tmp_path / "test_bindings.py" + test.write_text( + "import pytest\n" + "class TestBindings:\n" + ' @pytest.mark.parametrize("framework_id", ["strands", "pydantic_ai"])\n' + " def test_behavior(self, framework_id): pass\n" + ) + nodes = collected_nodes([str(test)]) + assert {node.frameworks for node in nodes} == { + frozenset({"strands"}), + frozenset({"pydantic_ai"}), + } diff --git a/tests/framework_conformance/test_files_image_passthrough_matrix.py b/tests/framework_conformance/test_files_image_passthrough_matrix.py index 1a460b103..afad4f485 100644 --- a/tests/framework_conformance/test_files_image_passthrough_matrix.py +++ b/tests/framework_conformance/test_files_image_passthrough_matrix.py @@ -1,481 +1,65 @@ -"""Live matrix proving each IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS entry -actually passes an image band_read_room_file result through as real -vision/image content -- not just that the bookkeeping constant lists it. - -Each probe drives the framework's real tool-dispatch code path with a fake -tools object whose read_room_file returns the exact MCP-image-content shape -AgentTools.read_room_file produces for a small previewable image, and asserts -the framework's own outgoing tool-result shape is a real image block rather -than a json.dumps'd text blob. Deeper framework-specific coverage (the -non-image degrade-to-text path, error handling, custom-tool interaction) -stays in each framework's own test file -- this matrix exists to answer one -question, uniformly, for every framework that claims support: does a real -image actually get through. - -To add a framework here: write a probe, add it to IMAGE_PASSTHROUGH_PROBES, -and add the framework_id to IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS in -test_adapter_conformance.py -- test_probe_registry_matches_supported_framework_ids -fails loudly if the two ever name different frameworks. -""" +"""ImagePassthrough behavior.""" from __future__ import annotations -import base64 -from collections.abc import Awaitable, Callable, Iterable -from types import SimpleNamespace -from typing import Any -from unittest.mock import AsyncMock, MagicMock - import pytest -from band.core.types import AdapterFeatures, Capability -from band.integrations.mcp import BandMCPTransport -from band.runtime.tools import TOOL_DEFINITIONS, TOOL_MODELS, BandTool, ToolCallOutcome +from band.core.types import Capability +from tests.framework_conformance.imageprobes import ( + _CREWAI_AVAILABLE, + IMAGE_PASSTHROUGH_PROBES, + ReadRoomFileTools, + _framework_param, +) from tests.framework_conformance.test_adapter_conformance import ( IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS, ) -try: - import crewai # noqa: F401 - - _CREWAI_AVAILABLE = True -except ImportError: - _CREWAI_AVAILABLE = False - -try: - import pydantic_ai # noqa: F401 - - _PYDANTIC_AI_AVAILABLE = True -except ImportError: - _PYDANTIC_AI_AVAILABLE = False - -try: - import nooa # noqa: F401 - - _NOOA_AVAILABLE = True -except ImportError: - _NOOA_AVAILABLE = False - -# crewai and pydantic-ai aren't both installed in every lane's venv (a -# three-way conflict group with parlant -- see `conflicts` in pyproject.toml): -# dev-crewai lacks pydantic-ai, dev-parlant lacks both. These framework_ids -# need a per-lane skip the other probes (all in every lane's `dev` baseline) -# don't. -_SOMETIMES_MISSING: dict[str, bool] = { - "crewai": _CREWAI_AVAILABLE, - "crewai_flow": _CREWAI_AVAILABLE, - "pydantic_ai": _PYDANTIC_AI_AVAILABLE, - # NOOA supports Python 3.12 and 3.13 on POSIX only. - "nooa": _NOOA_AVAILABLE, -} - -_IMAGE_RESULT: dict[str, Any] = { - "content": [{"type": "image", "data": "ZmFrZQ==", "mimeType": "image/png"}] -} - -# Derived, never re-typed: a probe asserting on a hand-written "ZmFrZQ==" would -# still pass if _IMAGE_RESULT changed underneath it. -_EXPECTED_BASE64: str = _IMAGE_RESULT["content"][0]["data"] -_EXPECTED_MIME_TYPE: str = _IMAGE_RESULT["content"][0]["mimeType"] -_EXPECTED_BYTES: bytes = base64.b64decode(_EXPECTED_BASE64) - - -def _is_expected_image(data: bytes | str, mime_type: str) -> bool: - """Whether a framework's outgoing image block carries the probe's image. - - ``data`` arrives in whichever encoding that framework's SDK uses, so a - probe passes what it found rather than normalising first. - """ - expected = _EXPECTED_BYTES if isinstance(data, bytes) else _EXPECTED_BASE64 - return data == expected and mime_type == _EXPECTED_MIME_TYPE - - -def _tool_named(tools: Iterable[Any], name: str) -> Any: - """The one tool a framework built for ``name``.""" - return next(tool for tool in tools if tool.name == name) - -class _StubReadRoomFileTools: - """Minimal AgentToolsProtocol double whose read_room_file/execute_tool_call - always return the fixed image result -- only what each probe's dispatch - path calls (MCP-based probes call read_room_file; generic-dispatch probes - like agno call execute_tool_call).""" - - async def read_room_file(self, file_id: str) -> dict[str, Any]: - del file_id - return _IMAGE_RESULT - - async def execute_tool_call( - self, tool_name: str, arguments: dict[str, Any] - ) -> dict[str, Any]: - del tool_name, arguments - return _IMAGE_RESULT - - -async def _probe_claude_sdk() -> bool: - """claude_sdk's tools are its room-bound Band MCP backend, dialed over HTTP.""" - from tests.mcpclient import ( # noqa: PLC0415 -- imports mcp, a claude_sdk extra absent from the standard dev-crewai/dev-parlant lane venvs - mcp_session, - started_backend, - ) - - async with ( - started_backend( - room_bound=True, - tool_definitions=[TOOL_DEFINITIONS[BandTool.READ_ROOM_FILE]], - get_tools={"room-1": _StubReadRoomFileTools()}.get, - ) as backend, - mcp_session(backend.endpoint(BandMCPTransport.HTTP, "room-1")) as session, - ): - result = await session.call_tool(BandTool.READ_ROOM_FILE, {"file_id": "file-1"}) - - blocks = [block.model_dump(exclude_none=True) for block in result.content] - return not result.isError and {"content": blocks} == _IMAGE_RESULT - - -async def _probe_anthropic() -> bool: - - from anthropic.types import ( # noqa: PLC0415 -- anthropic extra, absent from the standard dev-crewai/dev-parlant lane venvs - ToolUseBlock, - ) - - from band.adapters.anthropic import ( # noqa: PLC0415 -- anthropic extra, absent from the standard dev-crewai/dev-parlant lane venvs - AnthropicAdapter, - ) - - adapter = AnthropicAdapter(emit=()) - tools = MagicMock() - tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) - response = MagicMock() - response.content = [ - ToolUseBlock( - type="tool_use", - id="tool-1", - name=BandTool.READ_ROOM_FILE, - input={"file_id": "file-1"}, +class TestImagePassthrough: + def test_probe_registry_matches_supported_framework_ids(self) -> None: + """The probes are the live proof behind the supported-framework set.""" + assert ( + set(IMAGE_PASSTHROUGH_PROBES) == IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS ) - ] - - results = await adapter._process_tool_calls(response, tools) - content = results[0]["content"] - if not isinstance(content, list) or len(content) != 1: - return False - block = content[0] - return block["type"] == "image" and _is_expected_image( - block["source"]["data"], block["source"]["media_type"] - ) - - -async def _probe_opencode() -> bool: - from mcp.shared.memory import ( # noqa: PLC0415 -- opencode extra, absent from the standard dev-crewai/dev-parlant lane venvs - create_connected_server_and_client_session, - ) - - from band.integrations.mcp.engine import ( # noqa: PLC0415 -- opencode extra, absent from the standard dev-crewai/dev-parlant lane venvs - EmbeddedResolver, - EngineSpec, - build_engine, - build_tool_registration, - extend_with_chat_id, - ) - - resolver = EmbeddedResolver(get_tools=lambda _chat_id: _StubReadRoomFileTools()) - definition = TOOL_DEFINITIONS[BandTool.READ_ROOM_FILE] - registration = build_tool_registration( - definition, - extend_with_chat_id(definition.input_model, None), - resolver=resolver, - strip_chat_id=True, - ) - mcp = build_engine(EngineSpec(name="probe-opencode", tools=(registration,))) - - async with create_connected_server_and_client_session(mcp) as session: - result = await session.call_tool( - BandTool.READ_ROOM_FILE, {"chat_id": "room-1", "file_id": "file-1"} + @pytest.mark.skipif( + not _CREWAI_AVAILABLE, reason="crewai not installed in this venv" + ) + def test_crewai_platform_tool_name_is_plain_str(self) -> None: + """CrewAI's real BaseTool doesn't validate field defaults, so a bare + BandTool (StrEnum) default would leave tool.name a BandTool instance at + runtime instead of the str the field is typed as -- str(spec.name) at + the PlatformTool definition must keep it a plain str.""" + from band.integrations.crewai.tools import ( # noqa: PLC0415 -- crewai extra, absent from the standard dev-crewai/dev-parlant lane venvs + CrewAIToolContext, + NoopReporter, + build_band_crewai_tools, ) - if result.isError or len(result.content) != 1: - return False - block = result.content[0] - return block.type == "image" and _is_expected_image(block.data, block.mimeType) - - -async def _probe_gemini() -> bool: - - from google.genai import ( # noqa: PLC0415 -- gemini extra, absent from the standard dev-crewai/dev-parlant lane venvs - types, - ) - - from band.adapters.gemini import ( # noqa: PLC0415 -- gemini extra, absent from the standard dev-crewai/dev-parlant lane venvs - GeminiAdapter, - ) - - adapter = GeminiAdapter() - tools = MagicMock() - tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) - function_calls = [ - types.FunctionCall( - name=BandTool.READ_ROOM_FILE, args={"file_id": "file-1"}, id="c1" + context = CrewAIToolContext(room_id="room-1", tools=ReadRoomFileTools()) + tools = build_band_crewai_tools( + get_context=lambda: context, + reporter=NoopReporter(), + capabilities=frozenset({Capability.FILES}), ) - ] - parts = await adapter._process_function_calls(function_calls, tools) + for tool in tools: + assert type(tool.name) is str, ( + f"{tool.name!r} is {type(tool.name)}, not plain str" + ) - function_response = parts[0].function_response - if function_response is None or not function_response.parts: - return False - inline_data = function_response.parts[0].inline_data - return inline_data is not None and _is_expected_image( - inline_data.data, inline_data.mime_type + @pytest.mark.asyncio + @pytest.mark.parametrize( + "framework_id", + [_framework_param(fid) for fid in sorted(IMAGE_PASSTHROUGH_PROBES)], ) + async def test_image_result_passes_through_as_real_content( + self, framework_id: str + ) -> None: + probe = IMAGE_PASSTHROUGH_PROBES[framework_id] - -async def _probe_langgraph() -> bool: - - from band.integrations.langgraph.langchain_tools import ( # noqa: PLC0415 -- langgraph extra, absent from the standard dev-crewai/dev-parlant lane venvs - agent_tools_to_langchain, - ) - - tools = MagicMock() - tools.is_hub_room = False - tools.execute_tool_call = AsyncMock(return_value=_IMAGE_RESULT) - wrapped = { - tool.name: tool - for tool in agent_tools_to_langchain( - tools, - features=AdapterFeatures(capabilities=frozenset({Capability.FILES})), + assert await probe(), ( + f"{framework_id} did not pass an image band_read_room_file result " + "through as real image content" ) - } - - result = await wrapped[BandTool.READ_ROOM_FILE].ainvoke({"file_id": "file-1"}) - - if not isinstance(result, list) or len(result) != 1: - return False - block = result[0] - return block["type"] == "image" and _is_expected_image( - block["base64"], block["mime_type"] - ) - - -async def _probe_agno() -> bool: - from agno.tools.function import ( # noqa: PLC0415 -- agno extra, absent from the standard dev-crewai/dev-parlant lane venvs - ToolResult, - ) - - from band.adapters.agno import ( # noqa: PLC0415 -- agno extra, absent from the standard dev-crewai/dev-parlant lane venvs - _bind_room_tools, - _make_band_entrypoint, - ) - - entry = _make_band_entrypoint(BandTool.READ_ROOM_FILE) - with _bind_room_tools(_StubReadRoomFileTools()): - result = await entry(file_id="file-1") - - if not isinstance(result, ToolResult) or not result.images: - return False - image = result.images[0] - return len(result.images) == 1 and _is_expected_image( - image.content, image.mime_type - ) - - -async def _probe_strands() -> bool: - from band.adapters.strands import ( # noqa: PLC0415 -- strands extra, absent from the standard dev-crewai/dev-parlant lane venvs - _tool_result, - ) - - tool_use = {"toolUseId": "t1", "name": BandTool.READ_ROOM_FILE, "input": {}} - - result = _tool_result(tool_use, value=_IMAGE_RESULT, ok=True) - - # Strands names the format bare ("png"), not as a mime type. - expected_format = _EXPECTED_MIME_TYPE.removeprefix("image/") - return result["content"] == [ - {"image": {"format": expected_format, "source": {"bytes": _EXPECTED_BYTES}}} - ] - - -async def _probe_nooa() -> bool: - from band.adapters.nooa.tools import ( # noqa: PLC0415 -- nooa extra, absent outside Python 3.12-3.13 on POSIX - RoomToolSpec, - room_tools_class, - ) - - async def read(tools: Any, arguments: dict[str, Any]) -> object: - return _IMAGE_RESULT - - spec = RoomToolSpec( - BandTool.READ_ROOM_FILE, TOOL_MODELS[BandTool.READ_ROOM_FILE], read - ) - room = room_tools_class([spec])(emit_tool_calls=False) - async with room.bound_to(MagicMock()): - result = await getattr(room, BandTool.READ_ROOM_FILE)(file_id="f1") - - [image] = result - return image.modality == "image" and _is_expected_image( - image._base64_data(), image.media_type - ) - - -async def _probe_copilot_sdk() -> bool: - - from copilot import ( # noqa: PLC0415 -- copilot_sdk extra, absent from the standard dev-crewai/dev-parlant lane venvs - ToolInvocation, - ) - - from band.adapters.copilot_sdk import ( # noqa: PLC0415 -- copilot_sdk extra, absent from the standard dev-crewai/dev-parlant lane venvs - CopilotSDKAdapter, - ) - - room_tools = MagicMock() - room_tools.execute_tool_call_structured = AsyncMock( - return_value=ToolCallOutcome(value=_IMAGE_RESULT, ok=True) - ) - adapter = CopilotSDKAdapter.__new__(CopilotSDKAdapter) - adapter.features = SimpleNamespace(emit=()) - adapter._custom_tools = [] - adapter._custom_effects = {} - adapter._turn_state = {} - adapter._room_tools = {"room-1": room_tools} - - result = await adapter._execute_bridged_tool( - "room-1", - ToolInvocation( - tool_call_id="c1", tool_name=BandTool.READ_ROOM_FILE, arguments={} - ), - ) - - binary = result.binary_results_for_llm - if not binary or len(binary) != 1: - return False - return binary[0].type == "image" and _is_expected_image( - binary[0].data, binary[0].mime_type - ) - - -async def _probe_codex() -> bool: - from band.adapters.codex import ( # noqa: PLC0415 -- codex extra, absent from the standard dev-crewai/dev-parlant lane venvs - _image_content_items, - ) - - content_items = _image_content_items(_IMAGE_RESULT) - - data_uri = f"data:{_EXPECTED_MIME_TYPE};base64,{_EXPECTED_BASE64}" - return content_items == [{"type": "inputImage", "imageUrl": data_uri}] - - -async def _probe_pydantic_ai() -> bool: - from band.adapters.pydantic_ai import ( # noqa: PLC0415 -- pydantic_ai extra, absent from the standard dev-crewai/dev-parlant lane venvs - PydanticAIAdapter, - PydanticAIAdapterConfig, - ) - - adapter = PydanticAIAdapter( - PydanticAIAdapterConfig(model="test"), capabilities=Capability.FILES - ) - await adapter.on_started(agent_name="Probe", agent_description="probe") - read_room_file = adapter._agent._function_toolset.tools[BandTool.READ_ROOM_FILE] - - result = await read_room_file.function( - SimpleNamespace(deps=_StubReadRoomFileTools(), tool_call_id="probe"), - file_id="file-1", - ) - - if not isinstance(result, list) or len(result) != 1: - return False - binary = result[0] - return _is_expected_image(binary.data, binary.media_type) - - -async def _probe_crewai() -> bool: - from band.integrations.crewai.tools import ( # noqa: PLC0415 -- crewai extra, absent from the standard dev-crewai/dev-parlant lane venvs - CrewAIToolContext, - NoopReporter, - build_band_crewai_tools, - vision_sentinel, - ) - - context = CrewAIToolContext(room_id="room-1", tools=_StubReadRoomFileTools()) - tools = build_band_crewai_tools( - get_context=lambda: context, - reporter=NoopReporter(), - capabilities=frozenset({Capability.FILES}), - ) - read_room_file = _tool_named(tools, BandTool.READ_ROOM_FILE) - - result = read_room_file._run(file_id="file-1") - - return result == vision_sentinel(_IMAGE_RESULT) - - -IMAGE_PASSTHROUGH_PROBES: dict[str, Callable[[], Awaitable[bool]]] = { - "claude_sdk": _probe_claude_sdk, - "anthropic": _probe_anthropic, - "opencode": _probe_opencode, - "gemini": _probe_gemini, - "langgraph": _probe_langgraph, - "agno": _probe_agno, - "strands": _probe_strands, - "nooa": _probe_nooa, - "copilot_sdk": _probe_copilot_sdk, - "codex": _probe_codex, - "pydantic_ai": _probe_pydantic_ai, - "crewai": _probe_crewai, - # crewai_flow shares integrations/crewai/tools.py with crewai -- same probe. - "crewai_flow": _probe_crewai, -} - - -def test_probe_registry_matches_supported_framework_ids() -> None: - """The probes are the live proof behind the supported-framework set.""" - assert set(IMAGE_PASSTHROUGH_PROBES) == IMAGE_PASSTHROUGH_SUPPORTED_FRAMEWORK_IDS - - -@pytest.mark.skipif(not _CREWAI_AVAILABLE, reason="crewai not installed in this venv") -def test_crewai_platform_tool_name_is_plain_str() -> None: - """CrewAI's real BaseTool doesn't validate field defaults, so a bare - BandTool (StrEnum) default would leave tool.name a BandTool instance at - runtime instead of the str the field is typed as -- str(spec.name) at - the PlatformTool definition must keep it a plain str.""" - from band.integrations.crewai.tools import ( # noqa: PLC0415 -- crewai extra, absent from the standard dev-crewai/dev-parlant lane venvs - CrewAIToolContext, - NoopReporter, - build_band_crewai_tools, - ) - - context = CrewAIToolContext(room_id="room-1", tools=_StubReadRoomFileTools()) - tools = build_band_crewai_tools( - get_context=lambda: context, - reporter=NoopReporter(), - capabilities=frozenset({Capability.FILES}), - ) - - for tool in tools: - assert type(tool.name) is str, ( - f"{tool.name!r} is {type(tool.name)}, not plain str" - ) - - -def _framework_param(framework_id: str) -> Any: - available = _SOMETIMES_MISSING.get(framework_id, True) - return pytest.param( - framework_id, - marks=pytest.mark.skipif( - not available, reason=f"{framework_id} not installed in this venv" - ), - ) - - -@pytest.mark.asyncio -@pytest.mark.parametrize( - "framework_id", - [_framework_param(fid) for fid in sorted(IMAGE_PASSTHROUGH_PROBES)], -) -async def test_image_result_passes_through_as_real_content(framework_id: str) -> None: - probe = IMAGE_PASSTHROUGH_PROBES[framework_id] - - assert await probe(), ( - f"{framework_id} did not pass an image band_read_room_file result " - "through as real image content" - ) diff --git a/tests/framework_conformance/test_lane_scheduling.py b/tests/framework_conformance/test_lane_scheduling.py index caa442d74..5aa79245a 100644 --- a/tests/framework_conformance/test_lane_scheduling.py +++ b/tests/framework_conformance/test_lane_scheduling.py @@ -17,18 +17,14 @@ from __future__ import annotations -from types import SimpleNamespace +import tomllib import pytest +from packaging.requirements import Requirement from tests.e2e.baseline.agents import ( - LANE_MARKER, - PER_ADAPTER_MARKER, - WITH_ADAPTERS_MARKER, Adapter, Lane, - PerAdapter, - WithAdapters, adapter_params, ) from tests.e2e.baseline.lane_selection import ( @@ -42,214 +38,185 @@ spec_for, specs, ) -from tests.e2e.baseline.toolkit.ci_lanes import ci_lanes, hosting_lanes +from tests.e2e.baseline.toolkit.ci_lanes import EXTRA_HOSTS, ci_lanes, hosting_lanes from tests.e2e.baseline.toolkit.deps import Extra - - -class _FakeItem: - """Minimal ``pytest.Item`` stand-in for the collection hooks. - - Models only what ``item_frameworks`` / ``_override_lane`` read (callspec params, - the per-adapter / with-adapters / lane markers) and records ``add_marker`` skips so - a test can assert whether ``apply_lane_skips`` skipped it. - """ - - def __init__( - self, - nodeid: str, - *, - agents: tuple[Adapter, ...] | None = None, - adapter_id: str | None = None, - peer: Adapter | None = None, - assigned_lane: Lane | None = None, - ) -> None: - self.nodeid = nodeid - self._markers: dict[str, SimpleNamespace] = {} - self._added: list[object] = [] - if agents is not None: - req = WithAdapters(adapters=agents, prompt=None, features=None, tools=None) - self._markers[WITH_ADAPTERS_MARKER] = SimpleNamespace(args=(req,)) - if adapter_id is not None: - self.callspec = SimpleNamespace(params={"adapter_id": adapter_id}) - build = PerAdapter(prompt=None, features=None, tools=None, peer=peer) - self._markers[PER_ADAPTER_MARKER] = SimpleNamespace(args=(build,)) - if assigned_lane is not None: - self._markers[LANE_MARKER] = SimpleNamespace(args=(assigned_lane,)) - - def get_closest_marker(self, name: str) -> SimpleNamespace | None: - return self._markers.get(name) - - def add_marker(self, marker: object) -> None: - self._added.append(marker) - - @property - def skipped(self) -> bool: - return any(getattr(m, "name", None) == "skip" for m in self._added) - - -def _two_adapters_in_different_lanes() -> tuple[Adapter, Adapter]: - populated = [lane for lane in ci_lanes() if lane.adapters] - if len(populated) < 2: - pytest.skip("need >=2 populated CI lanes to exercise the schedulability guard") - return populated[0].adapters[0], populated[1].adapters[0] - - -# --- matrix-invariance: single-adapter cells shard exactly by their home lane -------- - - -def test_single_adapter_cells_schedule_by_home_lane() -> None: - """For every registered adapter and every lane, a lone cell runs iff active==home.""" - lane_ids = [str(cl.id) for cl in ci_lanes()] - for spec in specs(include_pending=True): - home = str(adapter_lane(spec)) - for active in lane_ids: - item = _FakeItem(f"m.py::test[{spec.id}]", adapter_id=str(spec.id)) - apply_lane_skips(active, [item]) - assert item.skipped == (home != active), ( - f"{spec.id} active={active} home={home}: skipped={item.skipped}" +from tests.framework_conformance.lanekit import ( + FakeItem, + _two_adapters_in_different_lanes, +) +from tests.paths import REPO_ROOT + + +class TestLaneScheduling: + def test_single_adapter_cells_schedule_by_home_lane(self) -> None: + """For every registered adapter and every lane, a lone cell runs iff active==home.""" + lane_ids = [str(cl.id) for cl in ci_lanes()] + for spec in specs(include_pending=True): + home = str(adapter_lane(spec)) + for active in lane_ids: + item = FakeItem(f"m.py::test[{spec.id}]", adapter_id=str(spec.id)) + apply_lane_skips(active, [item]) + assert item.skipped == (home != active), ( + f"{spec.id} active={active} home={home}: skipped={item.skipped}" + ) + + def test_adapter_agnostic_item_runs_in_every_lane(self) -> None: + for cl in ci_lanes(): + item = FakeItem("p.py::test_agnostic") + apply_lane_skips(str(cl.id), [item]) + assert not item.skipped + + def test_unknown_active_lane_is_a_usage_error(self) -> None: + with pytest.raises(pytest.UsageError): + apply_lane_skips( + "no-such-lane", [FakeItem("x.py::t", adapter_id="anthropic")] ) - -def test_adapter_agnostic_item_runs_in_every_lane() -> None: - for cl in ci_lanes(): - item = _FakeItem("p.py::test_agnostic") - apply_lane_skips(str(cl.id), [item]) - assert not item.skipped - - -def test_unknown_active_lane_is_a_usage_error() -> None: - with pytest.raises(pytest.UsageError): - apply_lane_skips("no-such-lane", [_FakeItem("x.py::t", adapter_id="anthropic")]) - - -# --- schedulability guard: cross-lane spans fail unless assigned -------------------- - - -def test_cross_lane_with_adapters_fails_collection() -> None: - a, b = _two_adapters_in_different_lanes() - item = _FakeItem("x.py::test_cross", agents=(a, b)) - with pytest.raises(pytest.UsageError, match="unschedulable"): - assert_every_item_is_schedulable([item]) - - -def test_cross_lane_peer_fails_collection() -> None: - """Peer-aware: a cell whose peer lives in another lane trips the guard too.""" - a, b = _two_adapters_in_different_lanes() - item = _FakeItem("x.py::test_peer", adapter_id=str(a), peer=b) - with pytest.raises(pytest.UsageError, match="unschedulable"): - assert_every_item_is_schedulable([item]) - - -def test_lane_override_makes_cross_lane_schedulable() -> None: - a, b = _two_adapters_in_different_lanes() - item = _FakeItem( - "x.py::test_ok", - adapter_id=str(a), - peer=b, - assigned_lane=adapter_lane(spec_for(a)), + def test_cross_lane_with_adapters_fails_collection(self) -> None: + a, b = _two_adapters_in_different_lanes() + item = FakeItem("x.py::test_cross", agents=(a, b)) + with pytest.raises(pytest.UsageError, match="unschedulable"): + assert_every_item_is_schedulable([item]) + + def test_cross_lane_peer_fails_collection(self) -> None: + """Peer-aware: a cell whose peer lives in another lane trips the guard too.""" + a, b = _two_adapters_in_different_lanes() + item = FakeItem("x.py::test_peer", adapter_id=str(a), peer=b) + with pytest.raises(pytest.UsageError, match="unschedulable"): + assert_every_item_is_schedulable([item]) + + def test_lane_override_makes_cross_lane_schedulable(self) -> None: + a, b = _two_adapters_in_different_lanes() + item = FakeItem( + "x.py::test_ok", + adapter_id=str(a), + peer=b, + assigned_lane=adapter_lane(spec_for(a)), + ) + assert_every_item_is_schedulable([item]) # no raise + + def test_same_lane_peer_is_schedulable(self) -> None: + """A peer in the cell's own lane never spans (the cross-framework/same-lane case).""" + item = FakeItem( + "x.py::test_same", adapter_id="anthropic", peer=Adapter.CLAUDE_SDK + ) + assert_every_item_is_schedulable([item]) # both core + # ...and it runs in core, skips elsewhere. + core = FakeItem("x.py::t", adapter_id="anthropic", peer=Adapter.CLAUDE_SDK) + apply_lane_skips("core", [core]) + assert not core.skipped + + def test_lane_override_runs_only_in_assigned_lane(self) -> None: + a, b = _two_adapters_in_different_lanes() + home_a = adapter_lane(spec_for(a)) + run = FakeItem("x.py::t", adapter_id=str(a), peer=b, assigned_lane=home_a) + apply_lane_skips(str(home_a), [run]) + assert not run.skipped + other = next(str(cl.id) for cl in ci_lanes() if str(cl.id) != str(home_a)) + skip = FakeItem("x.py::t", adapter_id=str(a), peer=b, assigned_lane=home_a) + apply_lane_skips(other, [skip]) + assert skip.skipped + + def test_hosting_lanes_truth_table(self) -> None: + """A dev home hosts in every dev lane; incompatible extras host nowhere; empty→all.""" + dev_lanes = frozenset(str(cl.id) for cl in ci_lanes() if cl.extra == Extra.DEV) + all_lanes = frozenset(str(cl.id) for cl in ci_lanes()) + assert hosting_lanes(frozenset({str(Adapter.ANTHROPIC)})) == dev_lanes + assert hosting_lanes(frozenset()) == all_lanes + assert ( + hosting_lanes(frozenset({str(Adapter.ANTHROPIC), str(Adapter.CREWAI)})) + == frozenset() + ) + + def test_lane_override_must_name_a_hosting_lane(self) -> None: + """A real-but-non-hosting @lane target (wrong extra) fails the guard — finding 1. + + agno (core) + gemini (google) share the ``dev`` extra; ``crewai`` is ``dev-crewai`` + and cannot host them, so pinning @lane(crewai) is a wrong-but-real lane. + """ + item = FakeItem( + "x.py::t", adapter_id="agno", peer=Adapter.GEMINI, assigned_lane=Lane.CREWAI + ) + with pytest.raises(pytest.UsageError, match="no lane hosts all its frameworks"): + assert_every_item_is_schedulable([item]) + + def test_incompatible_extras_are_unschedulable(self) -> None: + """crewai + a dev framework need different extras — no lane hosts them; no @lane helps.""" + item = FakeItem("x.py::t", adapter_id="anthropic", peer=Adapter.CREWAI) + with pytest.raises(pytest.UsageError, match="incompatible uv extras"): + assert_every_item_is_schedulable([item]) + pinned = FakeItem( + "x.py::t", + adapter_id="anthropic", + peer=Adapter.CREWAI, + assigned_lane=Lane.CORE, + ) + with pytest.raises(pytest.UsageError, match="no lane hosts all its frameworks"): + assert_every_item_is_schedulable([pinned]) + + def test_same_extra_cross_home_needs_lane_then_passes(self) -> None: + """agno (core) + gemini (google) share the dev extra: ambiguous → needs @lane, which fixes it.""" + bare = FakeItem("x.py::t", adapter_id="agno", peer=Adapter.GEMINI) + with pytest.raises(pytest.UsageError, match="add @lane"): + assert_every_item_is_schedulable([bare]) + pinned = FakeItem( + "x.py::t", adapter_id="agno", peer=Adapter.GEMINI, assigned_lane=Lane.GOOGLE + ) + assert_every_item_is_schedulable([pinned]) # google hosts both dev frameworks + + def test_peer_deps_fold_into_single_requires_mark(self) -> None: + """adapter_params(peer=X) → exactly one requires mark == dedup(cell ∪ peer) deps.""" + params = adapter_params(include={Adapter.ANTHROPIC}, peer=Adapter.LANGGRAPH) + (param,) = params + requires_marks = [m for m in param.marks if m.name == REQUIRES_MARKER] + assert len(requires_marks) == 1, ( + "peer deps must ride on ONE mark, not a second one" + ) + got = set(requires_marks[0].args[0]) + expected = set(spec_for(Adapter.ANTHROPIC).requires) | set( + spec_for(Adapter.LANGGRAPH).requires + ) + assert got == expected + + def test_no_peer_leaves_requires_mark_unchanged(self) -> None: + (param,) = adapter_params(include={Adapter.ANTHROPIC}) + requires_marks = [m for m in param.marks if m.name == REQUIRES_MARKER] + assert len(requires_marks) == 1 + assert set(requires_marks[0].args[0]) == set( + spec_for(Adapter.ANTHROPIC).requires + ) + + def test_empty_tools_builds_no_custom_tools(self) -> None: + """tools=[] must resolve to no custom tools (withholding a tool from A must stick).""" + assert _custom_tool_defs([]) is None + assert _custom_tool_defs(None) is None + + @pytest.mark.parametrize( + ("frameworks", "expected"), + [ + ({Adapter.STRANDS, Adapter.LANGGRAPH}, {Lane.STRANDS, Lane.NOOA}), + ({Adapter.STRANDS, Adapter.NOOA}, {Lane.STRANDS, Lane.NOOA}), + ({Adapter.STRANDS, Adapter.PYDANTIC_AI}, set()), + ], ) - assert_every_item_is_schedulable([item]) # no raise - - -def test_same_lane_peer_is_schedulable() -> None: - """A peer in the cell's own lane never spans (the cross-framework/same-lane case).""" - item = _FakeItem("x.py::test_same", adapter_id="anthropic", peer=Adapter.CLAUDE_SDK) - assert_every_item_is_schedulable([item]) # both core - # ...and it runs in core, skips elsewhere. - core = _FakeItem("x.py::t", adapter_id="anthropic", peer=Adapter.CLAUDE_SDK) - apply_lane_skips("core", [core]) - assert not core.skipped - - -def test_lane_override_runs_only_in_assigned_lane() -> None: - a, b = _two_adapters_in_different_lanes() - home_a = adapter_lane(spec_for(a)) - run = _FakeItem("x.py::t", adapter_id=str(a), peer=b, assigned_lane=home_a) - apply_lane_skips(str(home_a), [run]) - assert not run.skipped - other = next(str(cl.id) for cl in ci_lanes() if str(cl.id) != str(home_a)) - skip = _FakeItem("x.py::t", adapter_id=str(a), peer=b, assigned_lane=home_a) - apply_lane_skips(other, [skip]) - assert skip.skipped - - -# --- hosting: which lanes a framework set can run in, and @lane validation ----------- - - -def test_hosting_lanes_truth_table() -> None: - """A dev home hosts in every dev lane; incompatible extras host nowhere; empty→all.""" - dev_lanes = frozenset(str(cl.id) for cl in ci_lanes() if cl.extra == Extra.DEV) - all_lanes = frozenset(str(cl.id) for cl in ci_lanes()) - core_home = str(adapter_lane(spec_for(Adapter.ANTHROPIC))) # 'core' (dev extra) - crewai_home = str(adapter_lane(spec_for(Adapter.CREWAI))) # 'crewai' (dev-crewai) - assert hosting_lanes(frozenset({core_home})) == dev_lanes - assert hosting_lanes(frozenset()) == all_lanes - assert hosting_lanes(frozenset({core_home, crewai_home})) == frozenset() - - -def test_lane_override_must_name_a_hosting_lane() -> None: - """A real-but-non-hosting @lane target (wrong extra) fails the guard — finding 1. - - agno (core) + gemini (google) share the ``dev`` extra; ``crewai`` is ``dev-crewai`` - and cannot host them, so pinning @lane(crewai) is a wrong-but-real lane. - """ - item = _FakeItem( - "x.py::t", adapter_id="agno", peer=Adapter.GEMINI, assigned_lane=Lane.CREWAI - ) - with pytest.raises(pytest.UsageError, match="no lane hosts all its frameworks"): - assert_every_item_is_schedulable([item]) - - -def test_incompatible_extras_are_unschedulable() -> None: - """crewai + a dev framework need different extras — no lane hosts them; no @lane helps.""" - item = _FakeItem("x.py::t", adapter_id="anthropic", peer=Adapter.CREWAI) - with pytest.raises(pytest.UsageError, match="incompatible uv extras"): - assert_every_item_is_schedulable([item]) - pinned = _FakeItem( - "x.py::t", adapter_id="anthropic", peer=Adapter.CREWAI, assigned_lane=Lane.CORE - ) - with pytest.raises(pytest.UsageError, match="no lane hosts all its frameworks"): - assert_every_item_is_schedulable([pinned]) - - -def test_same_extra_cross_home_needs_lane_then_passes() -> None: - """agno (core) + gemini (google) share the dev extra: ambiguous → needs @lane, which fixes it.""" - bare = _FakeItem("x.py::t", adapter_id="agno", peer=Adapter.GEMINI) - with pytest.raises(pytest.UsageError, match="add @lane"): - assert_every_item_is_schedulable([bare]) - pinned = _FakeItem( - "x.py::t", adapter_id="agno", peer=Adapter.GEMINI, assigned_lane=Lane.GOOGLE - ) - assert_every_item_is_schedulable([pinned]) # google hosts both dev frameworks - - -# --- dep gating: peer requirements fold into ONE merged mark ------------------------- - - -def test_peer_deps_fold_into_single_requires_mark() -> None: - """adapter_params(peer=X) → exactly one requires mark == dedup(cell ∪ peer) deps.""" - params = adapter_params(include={Adapter.ANTHROPIC}, peer=Adapter.LANGGRAPH) - (param,) = params - requires_marks = [m for m in param.marks if m.name == REQUIRES_MARKER] - assert len(requires_marks) == 1, "peer deps must ride on ONE mark, not a second one" - got = set(requires_marks[0].args[0]) - expected = set(spec_for(Adapter.ANTHROPIC).requires) | set( - spec_for(Adapter.LANGGRAPH).requires - ) - assert got == expected - - -def test_no_peer_leaves_requires_mark_unchanged() -> None: - (param,) = adapter_params(include={Adapter.ANTHROPIC}) - requires_marks = [m for m in param.marks if m.name == REQUIRES_MARKER] - assert len(requires_marks) == 1 - assert set(requires_marks[0].args[0]) == set(spec_for(Adapter.ANTHROPIC).requires) - - -# --- withholding a tool sticks ------------------------------------------------------ - - -def test_empty_tools_builds_no_custom_tools() -> None: - """tools=[] must resolve to no custom tools (withholding a tool from A must stick).""" - assert _custom_tool_defs([]) is None - assert _custom_tool_defs(None) is None + def test_strands_nooa_hosting_is_framework_specific( + self, frameworks, expected + ) -> None: + assert hosting_lanes(frozenset(str(value) for value in frameworks)) == expected + + def test_strands_cannot_be_assigned_to_core(self) -> None: + item = FakeItem( + "x.py::t", adapter_id=str(Adapter.STRANDS), assigned_lane=Lane.CORE + ) + with pytest.raises(pytest.UsageError, match="no lane hosts all its frameworks"): + assert_every_item_is_schedulable([item]) + + def test_extra_hosts_have_their_public_dependencies(self) -> None: + extras = tomllib.loads((REPO_ROOT / "pyproject.toml").read_text())["project"][ + "optional-dependencies" + ] + for extra, adapters in EXTRA_HOSTS.items(): + installed = {Requirement(value).name for value in extras[extra]} + for adapter in adapters: + needed = {Requirement(value).name for value in extras[str(adapter)]} + assert needed <= installed, sorted(needed - installed) diff --git a/tests/framework_conformance/test_scorecard.py b/tests/framework_conformance/test_scorecard.py index 8c6fccfca..1b5aa2cd0 100644 --- a/tests/framework_conformance/test_scorecard.py +++ b/tests/framework_conformance/test_scorecard.py @@ -1,22 +1,8 @@ -"""Unit guards for the adapter×test scorecard (``ExcludedAdapter`` + ``scorecard``). - -Pure-function tests (no live platform), so they run in the ordinary unit suite on every -PR rather than only in the manually-triggered E2E job — the scorecard is what keeps an -excluded adapter from vanishing from the matrix, and its reasons feed CI gating, so a -regression here silently drops rows or loses the N/A explanations. - -Covered: -* ``ExcludedAdapter`` requires a non-empty reason at construction (so ``@per_adapter`` - cannot exclude an adapter without saying why); -* ``@per_adapter`` drops the excluded adapters from the fanned cells yet carries their - reasons on the ``PerAdapter`` marker, and rejects an unregistered exclusion; -* ``na_rows`` turns those marker records into N/A rows; ``outcome_row`` maps a test - report to pass / fail / skip; ``merge`` unions per-lane cards (a real outcome beats a - skip, an N/A is never clobbered). -""" +"""Scorecard behavior.""" from __future__ import annotations +import importlib.util import json import subprocess import sys @@ -26,11 +12,8 @@ import pytest from tests.e2e.baseline.agents import ( - LANE_MARKER, - PER_ADAPTER_MARKER, Adapter, ExcludedAdapter, - PerAdapter, per_adapter, ) from tests.e2e.baseline.scorecard import ( @@ -51,499 +34,426 @@ outcome_row, to_markdown, ) -from tests.e2e.baseline.toolkit.ci_lanes import ci_lanes +from tests.e2e.baseline.toolkit.deps import Lane +from tests.framework_conformance.scorecardkit import ( + _ADAPTER_A, + _ADAPTER_B, + _LANE_A, + _LANE_B, + FakeMatrixItem, + ScorecardItem, + _parametrized_adapter_ids, + _per_adapter_marker, + _report, +) from tests.paths import REPO_ROOT -# --- ExcludedAdapter: a reason is mandatory ----------------------------------------- - - -def test_excluded_adapter_keeps_adapter_and_reason() -> None: - excluded = ExcludedAdapter(Adapter.CREWAI, "no per-turn usage") - assert excluded.adapter is Adapter.CREWAI - assert excluded.reason == "no per-turn usage" - - -@pytest.mark.parametrize("reason", ["", " ", "\n\t"]) -def test_excluded_adapter_rejects_empty_reason(reason: str) -> None: - with pytest.raises(ValueError, match="non-empty reason"): - ExcludedAdapter(Adapter.CREWAI, reason) - - -# --- @per_adapter: excluded cells drop out, but their reasons ride the marker -------- - - -def _per_adapter_marker(fn: object) -> PerAdapter: - """The ``PerAdapter`` payload a decorated function carries.""" - for mark in fn.pytestmark: # type: ignore[attr-defined] - if mark.name == PER_ADAPTER_MARKER: - return mark.args[0] - raise AssertionError("no per_adapter marker on the decorated function") - - -def _parametrized_adapter_ids(fn: object) -> list[str]: - for mark in fn.pytestmark: # type: ignore[attr-defined] - if mark.name == "parametrize": - return [param.id for param in mark.args[1]] - raise AssertionError("no parametrize marker on the decorated function") - - -def test_per_adapter_excludes_cell_but_carries_reason() -> None: - @per_adapter(exclude=[ExcludedAdapter(Adapter.CREWAI, "cumulative usage")]) - def fn() -> None: ... - - assert str(Adapter.CREWAI) not in _parametrized_adapter_ids(fn) - payload = _per_adapter_marker(fn) - assert payload.exclude == (ExcludedAdapter(Adapter.CREWAI, "cumulative usage"),) - - -def test_per_adapter_rejects_unregistered_exclusion() -> None: - # Adapter is a StrEnum, so a plain unregistered string is an unknown id. - with pytest.raises(ValueError, match="unregistered adapters"): - per_adapter(exclude=[ExcludedAdapter("no-such-adapter", "typo")])(lambda: None) # type: ignore[arg-type] +class TestScorecard: + def test_excluded_adapter_keeps_adapter_and_reason(self) -> None: + excluded = ExcludedAdapter(Adapter.CREWAI, "no per-turn usage") + assert excluded.adapter is Adapter.CREWAI + assert excluded.reason == "no per-turn usage" + + @pytest.mark.parametrize("reason", ["", " ", "\n\t"]) + def test_excluded_adapter_rejects_empty_reason(self, reason: str) -> None: + with pytest.raises(ValueError, match="non-empty reason"): + ExcludedAdapter(Adapter.CREWAI, reason) + + def test_per_adapter_excludes_cell_but_carries_reason(self) -> None: + @per_adapter(exclude=[ExcludedAdapter(Adapter.CREWAI, "cumulative usage")]) + def fn() -> None: ... + + assert str(Adapter.CREWAI) not in _parametrized_adapter_ids(fn) + payload = _per_adapter_marker(fn) + assert payload.exclude == (ExcludedAdapter(Adapter.CREWAI, "cumulative usage"),) + + def test_per_adapter_rejects_unregistered_exclusion(self) -> None: + # Adapter is a StrEnum, so a plain unregistered string is an unknown id. + with pytest.raises(ValueError, match="unregistered adapters"): + per_adapter(exclude=[ExcludedAdapter("no-such-adapter", "typo")])( + lambda: None + ) # type: ignore[arg-type] + + def test_na_rows_from_marker_exclusions(self) -> None: + exclude = ( + ExcludedAdapter(Adapter.CREWAI, "cumulative usage"), + ExcludedAdapter(Adapter.CREWAI_FLOW, "flow internals"), + ) + # Two collected cells of the same test share the marker; the reasons dedupe by key. + items = [ + ScorecardItem("m.py::test_x[anthropic]", exclude), + ScorecardItem("m.py::test_x[agno]", exclude), + ] + rows = na_rows(items) + assert rows[("m.py::test_x", "crewai")] == ScorecardRow( + "m.py::test_x", "crewai", "na", "cumulative usage" + ) + assert rows[("m.py::test_x", "crewai_flow")].reason == "flow internals" + assert len(rows) == 2 -# --- na_rows: marker exclusions become N/A rows ------------------------------------- - - -class _FakeItem: - """A ``pytest.Item`` stand-in exposing only what ``na_rows`` reads.""" - - def __init__(self, nodeid: str, exclude: tuple[ExcludedAdapter, ...] = ()) -> None: - self.nodeid = nodeid - build = PerAdapter(prompt=None, features=None, tools=None, exclude=exclude) - self._marker = SimpleNamespace(args=(build,)) - - def get_closest_marker(self, name: str) -> object | None: - return self._marker if name == PER_ADAPTER_MARKER else None - - -def test_na_rows_from_marker_exclusions() -> None: - exclude = ( - ExcludedAdapter(Adapter.CREWAI, "cumulative usage"), - ExcludedAdapter(Adapter.CREWAI_FLOW, "flow internals"), - ) - # Two collected cells of the same test share the marker; the reasons dedupe by key. - items = [ - _FakeItem("m.py::test_x[anthropic]", exclude), - _FakeItem("m.py::test_x[agno]", exclude), - ] - rows = na_rows(items) - assert rows[("m.py::test_x", "crewai")] == ScorecardRow( - "m.py::test_x", "crewai", "na", "cumulative usage" - ) - assert rows[("m.py::test_x", "crewai_flow")].reason == "flow internals" - assert len(rows) == 2 - - -def test_na_rows_ignores_items_without_per_adapter_marker() -> None: - class _Bare: - nodeid = "p.py::test_provisioning" - - def get_closest_marker(self, name: str) -> None: - return None - - assert na_rows([_Bare()]) == {} - - -# --- outcome_row: a test report -> a cell verdict ----------------------------------- - - -def _report( - nodeid: str, - when: str, - *, - outcome: str, - reason: str | None = None, - keywords: tuple[str, ...] = (), -) -> object: - longrepr = ("m.py", 1, f"Skipped: {reason}") if reason is not None else None - return SimpleNamespace( - nodeid=nodeid, - when=when, - skipped=outcome == "skipped", - failed=outcome == "failed", - passed=outcome == "passed", - longrepr=longrepr, - keywords=frozenset(keywords), - ) - + def test_na_rows_ignores_items_without_per_adapter_marker(self) -> None: + class _Bare: + nodeid = "p.py::test_provisioning" -def test_outcome_row_call_pass_and_fail() -> None: - key, row = outcome_row(_report("m.py::t[anthropic]", "call", outcome="passed")) - assert (key, row.status) == (("m.py::t", "anthropic"), "pass") - _, fail = outcome_row(_report("m.py::t[crewai]", "call", outcome="failed")) - assert fail.status == "fail" + def get_closest_marker(self, name: str) -> None: + return None + assert na_rows([_Bare()]) == {} -def test_outcome_row_setup_skip_captures_reason() -> None: - _, row = outcome_row( - _report("m.py::t[agno]", "setup", outcome="skipped", reason="lane 'core'") - ) - assert (row.status, row.reason) == ("skip", "lane 'core'") + def test_outcome_row_call_pass_and_fail(self) -> None: + key, row = outcome_row(_report("m.py::t[anthropic]", "call", outcome="passed")) + assert (key, row.status) == (("m.py::t", "anthropic"), "pass") + _, fail = outcome_row(_report("m.py::t[crewai]", "call", outcome="failed")) + assert fail.status == "fail" + def test_outcome_row_setup_skip_captures_reason(self) -> None: + _, row = outcome_row( + _report("m.py::t[agno]", "setup", outcome="skipped", reason="lane 'core'") + ) + assert (row.status, row.reason) == ("skip", "lane 'core'") + + def test_env_gated_skip_applies_both_skipif_and_marker(self) -> None: + @env_gated_skip(True, reason="flag is off") + def fn() -> None: ... + + marks = {mark.name for mark in fn.pytestmark} # type: ignore[attr-defined] + assert marks == {"skipif", ENV_GATED_MARKER} + + def test_outcome_row_env_gated_skip_reports_na_not_missing(self) -> None: + # A deployment flag that is permanently off in this environment (e.g. the SaaS + # E2E lanes' ff_file_transfer) must never read as "missing coverage" -- see + # ENV_GATED_MARKER. + _, row = outcome_row( + _report( + "m.py::t[anthropic]", + "setup", + outcome="skipped", + reason="E2E_FILE_TRANSFER is not true", + keywords=(ENV_GATED_MARKER,), + ) + ) + assert (row.status, row.reason) == ("na", "E2E_FILE_TRANSFER is not true") + + def test_outcome_row_setup_error_is_a_fail(self) -> None: + _, row = outcome_row(_report("m.py::t[agno]", "setup", outcome="failed")) + assert row.status == "fail" + + def test_outcome_row_records_bespoke_and_ignores_passing_setup(self) -> None: + key, row = outcome_row(_report("p.py::test_no_param", "call", outcome="passed")) + assert key == ("p.py::test_no_param", SUITE_ADAPTER) + assert row.status == "pass" + assert outcome_row(_report("m.py::t[agno]", "setup", outcome="passed")) is None + assert ( + outcome_row(_report("m.py::t[agno]", "teardown", outcome="passed")) is None + ) -def test_env_gated_skip_applies_both_skipif_and_marker() -> None: - @env_gated_skip(True, reason="flag is off") - def fn() -> None: ... + def test_outcome_row_keeps_non_adapter_parametrization_distinct(self) -> None: + key, row = outcome_row( + _report("e.py::test_send_event[thought]", "call", outcome="passed") + ) + assert key == ("e.py::test_send_event[thought]", SUITE_ADAPTER) + assert row.status == "pass" - marks = {mark.name for mark in fn.pytestmark} # type: ignore[attr-defined] - assert marks == {"skipif", ENV_GATED_MARKER} + def test_collector_combines_outcomes_and_na(self) -> None: + collector = ScorecardCollector(path="unused") + collector.pytest_runtest_logreport( + _report("m.py::t[anthropic]", "call", outcome="passed") + ) + item = ScorecardItem( + "m.py::t[anthropic]", (ExcludedAdapter(Adapter.CREWAI, "no usage"),) + ) + rows = {(r.test, r.adapter): r for r in collector.scorecard([item])} + assert rows[("m.py::t", "anthropic")].status == "pass" + assert rows[("m.py::t", "crewai")].status == "na" + + def test_collector_keeps_a_failed_first_attempt(self) -> None: + collector = ScorecardCollector(path="unused") + nodeid = "m.py::t[anthropic]" + collector.pytest_runtest_logreport(_report(nodeid, "call", outcome="failed")) + collector.pytest_runtest_logreport(_report(nodeid, "call", outcome="passed")) + rows = collector.scorecard([ScorecardItem(nodeid)]) + assert rows == [ScorecardRow("m.py::t", "anthropic", "fail")] + + def test_merge_prefers_real_outcome_over_skip_and_keeps_na(self) -> None: + lane_a = [ + ScorecardRow("t", "anthropic", "pass"), + ScorecardRow("t", "crewai", "skip", "lane"), + ScorecardRow("t", "crewai_flow", "na", "no usage"), + ] + lane_b = [ + ScorecardRow("t", "anthropic", "skip", "lane"), + ScorecardRow("t", "crewai", "fail"), + ScorecardRow("t", "crewai_flow", "na", "no usage"), + ] + merged = {(r.test, r.adapter): r for r in merge([lane_a, lane_b])} + assert merged[("t", "anthropic")].status == "pass" + assert merged[("t", "crewai")].status == "fail" + assert merged[("t", "crewai_flow")].status == "na" + + def test_merge_leaves_a_never_run_cell_visible_as_skip(self) -> None: + merged = merge([[ScorecardRow("t", "letta", "skip", "lane")]]) + assert merged[0].status == "skip" + + def test_gate_fails_on_a_fail_cell(self) -> None: + row = ScorecardRow("t", _ADAPTER_A, "fail") + lane = str(_LANE_A.id) + result = gate_manifest( + {(lane, "ubuntu"): [row]}, + [ExpectedCell("t", _ADAPTER_A, (lane,), "pass")], + {lane: ("ubuntu",)}, + lane, + "ubuntu", + ) + assert result.ok is False + assert result.failing == ( + ScorecardRow("t", _ADAPTER_A, "fail", lane=lane, os="ubuntu"), + ) + assert result.missing == () + + def test_gate_ignores_a_skip_cell_whose_lane_is_out_of_scope(self) -> None: + lane = str(_LANE_A.id) + row = ScorecardRow("t", _ADAPTER_B, "skip", "other lane") + result = gate_manifest( + {(lane, "ubuntu"): [row]}, + [ExpectedCell("t", _ADAPTER_B, (str(_LANE_B.id),), "pass")], + {lane: ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, + lane, + "ubuntu", + ) + assert result.ok is True + + def test_gate_fails_a_skip_cell_whose_lane_was_expected_to_run(self) -> None: + lane = str(_LANE_A.id) + row = ScorecardRow("t", _ADAPTER_A, "skip", "missing key") + result = gate_manifest( + {(lane, "ubuntu"): [row]}, + [ExpectedCell("t", _ADAPTER_A, (lane,), "pass")], + {lane: ("ubuntu",)}, + lane, + "ubuntu", + ) + assert result.ok is False + assert result.missing == ( + ScorecardRow( + "t", _ADAPTER_A, "skip", "missing key", lane=lane, os="ubuntu" + ), + ) + @pytest.mark.parametrize(("status", "ok"), [("pass", True), ("fail", False)]) + def test_a_selector_run_gates_only_the_cells_it_reported( + self, status: Status, ok: bool + ) -> None: + lane = str(_LANE_A.id) + selected = ExpectedCell("t_selected", _ADAPTER_A, (lane,), "pass") + deselected = ExpectedCell("t_deselected", _ADAPTER_A, (lane,), "pass") + result = gate_manifest( + {(lane, "ubuntu"): [ScorecardRow(selected.test, selected.adapter, status)]}, + [selected, deselected], + {lane: ("ubuntu",)}, + lane, + "ubuntu", + selected_tests_only=True, + ) + assert result.ok is ok + assert result.missing == () + + def test_manifest_gate_requires_bespoke_results_on_each_os(self) -> None: + cell = ExpectedCell("smoke.py::test_control", SUITE_ADAPTER, ("core",), "pass") + pass_row = ScorecardRow(cell.test, cell.adapter, "pass") + result = gate_manifest( + {("core", "ubuntu"): [pass_row]}, + [cell], + {"core": ("ubuntu", "windows")}, + "core", + "all", + ) + assert result.ok is False + assert [(row.lane, row.os, row.test) for row in result.missing] == [ + ("core", "windows", cell.test) + ] -def test_outcome_row_env_gated_skip_reports_na_not_missing() -> None: - # A deployment flag that is permanently off in this environment (e.g. the SaaS - # E2E lanes' ff_file_transfer) must never read as "missing coverage" -- see - # ENV_GATED_MARKER. - _, row = outcome_row( - _report( - "m.py::t[anthropic]", - "setup", - outcome="skipped", - reason="E2E_FILE_TRANSFER is not true", - keywords=(ENV_GATED_MARKER,), + def test_manifest_gate_rejects_skip_and_respects_explicit_na(self) -> None: + required = ExpectedCell("smoke.py::test_live", "anthropic", ("core",), "pass") + unsupported = ExpectedCell("smoke.py::test_file", "anthropic", ("core",), "na") + result = gate_manifest( + { + ("core", "ubuntu"): [ + ScorecardRow( + required.test, required.adapter, "skip", "missing key" + ), + ScorecardRow( + unsupported.test, unsupported.adapter, "na", "flag off" + ), + ] + }, + [required, unsupported], + {"core": ("ubuntu",)}, + "core", + "ubuntu", ) - ) - assert (row.status, row.reason) == ("na", "E2E_FILE_TRANSFER is not true") - - -def test_outcome_row_setup_error_is_a_fail() -> None: - _, row = outcome_row(_report("m.py::t[agno]", "setup", outcome="failed")) - assert row.status == "fail" - - -def test_outcome_row_records_bespoke_and_ignores_passing_setup() -> None: - key, row = outcome_row(_report("p.py::test_no_param", "call", outcome="passed")) - assert key == ("p.py::test_no_param", SUITE_ADAPTER) - assert row.status == "pass" - assert outcome_row(_report("m.py::t[agno]", "setup", outcome="passed")) is None - assert outcome_row(_report("m.py::t[agno]", "teardown", outcome="passed")) is None - - -def test_outcome_row_keeps_non_adapter_parametrization_distinct() -> None: - key, row = outcome_row( - _report("e.py::test_send_event[thought]", "call", outcome="passed") - ) - assert key == ("e.py::test_send_event[thought]", SUITE_ADAPTER) - assert row.status == "pass" - - -# --- collector + merge: a run's rows, then the cross-lane union ---------------------- - - -def test_collector_combines_outcomes_and_na() -> None: - collector = ScorecardCollector(path="unused") - collector.pytest_runtest_logreport( - _report("m.py::t[anthropic]", "call", outcome="passed") - ) - item = _FakeItem( - "m.py::t[anthropic]", (ExcludedAdapter(Adapter.CREWAI, "no usage"),) - ) - rows = {(r.test, r.adapter): r for r in collector.scorecard([item])} - assert rows[("m.py::t", "anthropic")].status == "pass" - assert rows[("m.py::t", "crewai")].status == "na" - - -def test_collector_keeps_a_failed_first_attempt() -> None: - collector = ScorecardCollector(path="unused") - nodeid = "m.py::t[anthropic]" - collector.pytest_runtest_logreport(_report(nodeid, "call", outcome="failed")) - collector.pytest_runtest_logreport(_report(nodeid, "call", outcome="passed")) - rows = collector.scorecard([_FakeItem(nodeid)]) - assert rows == [ScorecardRow("m.py::t", "anthropic", "fail")] - - -def test_merge_prefers_real_outcome_over_skip_and_keeps_na() -> None: - lane_a = [ - ScorecardRow("t", "anthropic", "pass"), - ScorecardRow("t", "crewai", "skip", "lane"), - ScorecardRow("t", "crewai_flow", "na", "no usage"), - ] - lane_b = [ - ScorecardRow("t", "anthropic", "skip", "lane"), - ScorecardRow("t", "crewai", "fail"), - ScorecardRow("t", "crewai_flow", "na", "no usage"), - ] - merged = {(r.test, r.adapter): r for r in merge([lane_a, lane_b])} - assert merged[("t", "anthropic")].status == "pass" - assert merged[("t", "crewai")].status == "fail" - assert merged[("t", "crewai_flow")].status == "na" - - -def test_merge_leaves_a_never_run_cell_visible_as_skip() -> None: - merged = merge([[ScorecardRow("t", "letta", "skip", "lane")]]) - assert merged[0].status == "skip" - - -# --- gate: required lane x OS cells --------------------------------------------------- - -# Two distinct lanes with at least one adapter each, read off the real registry rather -# than hand-picked ids — a gate case only needs "two different homes", not which ones. -_LANE_A, _LANE_B = [lane for lane in ci_lanes() if lane.adapters][:2] -_ADAPTER_A = str(_LANE_A.adapters[0]) -_ADAPTER_B = str(_LANE_B.adapters[0]) - - -def test_gate_fails_on_a_fail_cell() -> None: - row = ScorecardRow("t", _ADAPTER_A, "fail") - lane = str(_LANE_A.id) - result = gate_manifest( - {(lane, "ubuntu"): [row]}, - [ExpectedCell("t", _ADAPTER_A, (lane,), "pass")], - {lane: ("ubuntu",)}, - lane, - "ubuntu", - ) - assert result.ok is False - assert result.failing == ( - ScorecardRow("t", _ADAPTER_A, "fail", lane=lane, os="ubuntu"), - ) - assert result.missing == () - - -def test_gate_ignores_a_skip_cell_whose_lane_is_out_of_scope() -> None: - lane = str(_LANE_A.id) - row = ScorecardRow("t", _ADAPTER_B, "skip", "other lane") - result = gate_manifest( - {(lane, "ubuntu"): [row]}, - [ExpectedCell("t", _ADAPTER_B, (str(_LANE_B.id),), "pass")], - {lane: ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, - lane, - "ubuntu", - ) - assert result.ok is True - - -def test_gate_fails_a_skip_cell_whose_lane_was_expected_to_run() -> None: - lane = str(_LANE_A.id) - row = ScorecardRow("t", _ADAPTER_A, "skip", "missing key") - result = gate_manifest( - {(lane, "ubuntu"): [row]}, - [ExpectedCell("t", _ADAPTER_A, (lane,), "pass")], - {lane: ("ubuntu",)}, - lane, - "ubuntu", - ) - assert result.ok is False - assert result.missing == ( - ScorecardRow("t", _ADAPTER_A, "skip", "missing key", lane=lane, os="ubuntu"), - ) - - -@pytest.mark.parametrize(("status", "ok"), [("pass", True), ("fail", False)]) -def test_a_selector_run_gates_only_the_cells_it_reported( - status: Status, ok: bool -) -> None: - lane = str(_LANE_A.id) - selected = ExpectedCell("t_selected", _ADAPTER_A, (lane,), "pass") - deselected = ExpectedCell("t_deselected", _ADAPTER_A, (lane,), "pass") - result = gate_manifest( - {(lane, "ubuntu"): [ScorecardRow(selected.test, selected.adapter, status)]}, - [selected, deselected], - {lane: ("ubuntu",)}, - lane, - "ubuntu", - selected_tests_only=True, - ) - assert result.ok is ok - assert result.missing == () - - -def test_manifest_gate_requires_bespoke_results_on_each_os() -> None: - cell = ExpectedCell("smoke.py::test_control", SUITE_ADAPTER, ("core",), "pass") - pass_row = ScorecardRow(cell.test, cell.adapter, "pass") - result = gate_manifest( - {("core", "ubuntu"): [pass_row]}, - [cell], - {"core": ("ubuntu", "windows")}, - "core", - "all", - ) - assert result.ok is False - assert [(row.lane, row.os, row.test) for row in result.missing] == [ - ("core", "windows", cell.test) - ] - - -def test_manifest_gate_rejects_skip_and_respects_explicit_na() -> None: - required = ExpectedCell("smoke.py::test_live", "anthropic", ("core",), "pass") - unsupported = ExpectedCell("smoke.py::test_file", "anthropic", ("core",), "na") - result = gate_manifest( - { - ("core", "ubuntu"): [ - ScorecardRow(required.test, required.adapter, "skip", "missing key"), - ScorecardRow(unsupported.test, unsupported.adapter, "na", "flag off"), - ] - }, - [required, unsupported], - {"core": ("ubuntu",)}, - "core", - "ubuntu", - ) - assert result.ok is False - assert [row.test for row in result.missing] == [required.test] - - -def test_expected_manifest_matches_collected_baseline(tmp_path: Path) -> None: - generated = tmp_path / "expected-cells.json" - result = subprocess.run( - [ - sys.executable, - "-m", - "tests.e2e.baseline.scorecard", - "manifest", - "--out", - str(generated), - ], - cwd=REPO_ROOT, - capture_output=True, - text=True, - check=False, - ) - assert result.returncode == 0, result.stdout + result.stderr - checked_in = REPO_ROOT / "tests/e2e/baseline/expected-cells.json" - fresh = json.loads(generated.read_text()) - committed = json.loads(checked_in.read_text()) - assert fresh["supported_os"] == committed["supported_os"] - current = {(cell["test"], cell["adapter"]): cell for cell in fresh["cells"]} - expected = {(cell["test"], cell["adapter"]): cell for cell in committed["cells"]} - assert all(expected.get(key) == cell for key, cell in current.items()) - extra = [cell for key, cell in expected.items() if key not in current] - assert extra and all( - cell["test"].startswith("tests/e2e/baseline/smoke/adapters/test_parlant.py::") - for cell in extra - ) - - -class FakeMatrixItem: - """A ``pytest.Item`` stand-in exposing what ``lane_selection.expected_lane`` reads: - its ``adapter_id`` callspec param and an optional ``@lane`` override marker.""" - - def __init__( - self, nodeid: str, adapter: str, override_lane: str | None = None - ) -> None: - self.nodeid = nodeid - self.callspec = SimpleNamespace(params={"adapter_id": adapter}) - self._override = override_lane - - def get_closest_marker(self, name: str) -> object | None: - if name == LANE_MARKER and self._override is not None: - return SimpleNamespace(args=(self._override,)) - return None - - -def test_gate_honors_a_lane_pin_over_the_adapters_home_lane() -> None: - """A cell pinned by ``@lane`` cross-lane must gate on the pin, not the home lane. - - Reproduces the scenario ``ADDING_AN_ADAPTER.md`` prescribes: a ``@per_adapter`` - cell whose adapter's home lane is ``_LANE_A`` but is pinned to ``_LANE_B`` (e.g. to - share an extra with a cross-lane peer). Using the home lane alone here would - report this cell "missing" the moment its home lane's job runs — a legitimate - lane-scoped skip, not a silent failure. - """ - item = FakeMatrixItem(f"m.py::t[{_ADAPTER_A}]", _ADAPTER_A, str(_LANE_B.id)) - cell = next(c for c in expected_cells([item]) if c.adapter == _ADAPTER_A) - assert cell.lanes == (str(_LANE_B.id),) - - # The adapter's home lane (_LANE_A) ran this invocation; the cell is pinned - # elsewhere, so it must NOT be reported missing here. - home_only = gate_manifest( - {(str(_LANE_A.id), "ubuntu"): []}, - [cell], - {str(_LANE_A.id): ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, - str(_LANE_A.id), - "ubuntu", - ) - assert home_only.ok is True - assert home_only.missing == () - - # The pinned lane (_LANE_B) ran and reported nothing for this cell — that is a - # real gap. - pinned_ran = gate_manifest( - {(str(_LANE_B.id), "ubuntu"): []}, - [cell], - {str(_LANE_A.id): ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, - str(_LANE_B.id), - "ubuntu", - ) - assert pinned_ran.ok is False - assert pinned_ran.missing[0].test == cell.test - - -def test_environment_gated_na_is_expected_in_every_lane() -> None: - class FileCell(FakeMatrixItem): - def get_closest_marker(self, name: str) -> object | None: - if name == ENV_GATED_MARKER: - return SimpleNamespace() - if name == "skipif": - return SimpleNamespace(kwargs={"reason": "file transfer unavailable"}) - return super().get_closest_marker(name) - - item = FileCell(f"m.py::t[{_ADAPTER_A}]", _ADAPTER_A) - cell = next(c for c in expected_cells([item]) if c.adapter == _ADAPTER_A) - assert cell.status == "na" - assert str(_LANE_B.id) in cell.lanes - result = gate_manifest( - { - (str(_LANE_B.id), "ubuntu"): [ - ScorecardRow(cell.test, cell.adapter, "na", cell.reason) + assert result.ok is False + assert [row.test for row in result.missing] == [required.test] + + def test_expected_manifest_matches_collected_baseline(self, tmp_path: Path) -> None: + generated = tmp_path / "expected-cells.json" + result = subprocess.run( + [ + sys.executable, + "-m", + "tests.e2e.baseline.scorecard", + "manifest", + "--out", + str(generated), + ], + cwd=REPO_ROOT, + capture_output=True, + text=True, + check=False, + ) + assert result.returncode == 0, result.stdout + result.stderr + checked_in = REPO_ROOT / "tests/e2e/baseline/expected-cells.json" + fresh = json.loads(generated.read_text()) + committed = json.loads(checked_in.read_text()) + assert fresh["supported_os"] == committed["supported_os"] + current = {(cell["test"], cell["adapter"]): cell for cell in fresh["cells"]} + expected = { + (cell["test"], cell["adapter"]): cell for cell in committed["cells"] + } + assert all(expected.get(key) == cell for key, cell in current.items()) + for path in ( + "guards/test_strands_provider.py", + "smoke/matrix/test_strands_rehydration.py", + ): + owned = [ + cell + for cell in current.values() + if f"tests/e2e/baseline/{path}::" in cell["test"] ] - }, - [cell], - {str(_LANE_B.id): ("ubuntu",)}, - str(_LANE_B.id), - "ubuntu", - ) - assert result.ok is True - - -def test_gate_summary_reports_totals_and_names_the_culprit() -> None: - rows = [ - ScorecardRow("t", _ADAPTER_A, "pass"), - ScorecardRow("t", _ADAPTER_B, "fail"), - ] - result = GateResult(False, (rows[1],), ()) - summary = gate_summary(result, rows) - assert "GATE: FAIL" in summary - assert _ADAPTER_B in summary - - -# --- digest_body: the email-safe half of gate_summary (no header, no grid) ---------- - - -def test_digest_body_all_clear_has_no_problem_sections() -> None: - rows = [ScorecardRow("t", _ADAPTER_A, "pass"), ScorecardRow("t", _ADAPTER_B, "na")] - result = GateResult(True, (), ()) - body = digest_body(result, rows) - assert "| Passed | Failed | N/A | Skipped |" in body - assert "| 1 | 0 | 1 | 0 |" in body - assert "Failing" not in body - assert "Missing" not in body - - -def test_digest_body_lists_failing_and_missing_separately() -> None: - failing = ScorecardRow("t", _ADAPTER_A, "fail") - missing = ScorecardRow("t", _ADAPTER_B, "skip", "lane 'core'") - result = GateResult(False, (failing,), (missing,)) - body = digest_body(result, [failing, missing]) - assert "**Failing**" in body - assert f"`{_ADAPTER_A}`" in body.split("**Missing**")[0] - assert "**Missing** (lane ran, no result)" in body - assert f"`{_ADAPTER_B}`" in body.split("**Missing**")[1] - - -def test_digest_body_never_renders_a_grid() -> None: - rows = [ScorecardRow("t", _ADAPTER_A, "fail")] - result = GateResult(False, (rows[0],), ()) - body = digest_body(result, rows) - assert "| test |" not in body - - -def test_to_markdown_renders_grid_and_na_reasons() -> None: - md = to_markdown( - [ - ScorecardRow("m.py::test_x", "anthropic", "pass"), - ScorecardRow("m.py::test_x", "crewai", "na", "no per-turn usage"), + assert len(owned) == 1, f"missing or duplicated Strands cell: {path}" + assert owned[0]["lanes"] == [str(Lane.STRANDS)] + + extra = [cell for key, cell in expected.items() if key not in current] + if importlib.util.find_spec("parlant") is not None: + assert not extra + else: + assert extra + assert all( + cell["test"].startswith( + "tests/e2e/baseline/smoke/adapters/test_parlant.py::" + ) + for cell in extra + ) + + def test_gate_honors_a_lane_pin_over_the_adapters_home_lane(self) -> None: + """A cell pinned by ``@lane`` cross-lane must gate on the pin, not the home lane. + + Reproduces the scenario ``ADDING_AN_ADAPTER.md`` prescribes: a ``@per_adapter`` + cell whose adapter's home lane is ``_LANE_A`` but is pinned to ``_LANE_B`` (e.g. to + share an extra with a cross-lane peer). Using the home lane alone here would + report this cell "missing" the moment its home lane's job runs — a legitimate + lane-scoped skip, not a silent failure. + """ + item = FakeMatrixItem(f"m.py::t[{_ADAPTER_A}]", _ADAPTER_A, str(_LANE_B.id)) + cell = next(c for c in expected_cells([item]) if c.adapter == _ADAPTER_A) + assert cell.lanes == (str(_LANE_B.id),) + + # The adapter's home lane (_LANE_A) ran this invocation; the cell is pinned + # elsewhere, so it must NOT be reported missing here. + home_only = gate_manifest( + {(str(_LANE_A.id), "ubuntu"): []}, + [cell], + {str(_LANE_A.id): ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, + str(_LANE_A.id), + "ubuntu", + ) + assert home_only.ok is True + assert home_only.missing == () + + # The pinned lane (_LANE_B) ran and reported nothing for this cell — that is a + # real gap. + pinned_ran = gate_manifest( + {(str(_LANE_B.id), "ubuntu"): []}, + [cell], + {str(_LANE_A.id): ("ubuntu",), str(_LANE_B.id): ("ubuntu",)}, + str(_LANE_B.id), + "ubuntu", + ) + assert pinned_ran.ok is False + assert pinned_ran.missing[0].test == cell.test + + def test_environment_gated_na_is_expected_in_every_lane(self) -> None: + class FileCell(FakeMatrixItem): + def get_closest_marker(self, name: str) -> object | None: + if name == ENV_GATED_MARKER: + return SimpleNamespace() + if name == "skipif": + return SimpleNamespace( + kwargs={"reason": "file transfer unavailable"} + ) + return super().get_closest_marker(name) + + item = FileCell(f"m.py::t[{_ADAPTER_A}]", _ADAPTER_A) + cell = next(c for c in expected_cells([item]) if c.adapter == _ADAPTER_A) + assert cell.status == "na" + assert str(_LANE_B.id) in cell.lanes + result = gate_manifest( + { + (str(_LANE_B.id), "ubuntu"): [ + ScorecardRow(cell.test, cell.adapter, "na", cell.reason) + ] + }, + [cell], + {str(_LANE_B.id): ("ubuntu",)}, + str(_LANE_B.id), + "ubuntu", + ) + assert result.ok is True + + def test_gate_summary_reports_totals_and_names_the_culprit(self) -> None: + rows = [ + ScorecardRow("t", _ADAPTER_A, "pass"), + ScorecardRow("t", _ADAPTER_B, "fail"), ] - ) - assert "| test | anthropic | crewai |" in md - assert "no per-turn usage" in md + result = GateResult(False, (rows[1],), ()) + summary = gate_summary(result, rows) + assert "GATE: FAIL" in summary + assert _ADAPTER_B in summary + + def test_digest_body_all_clear_has_no_problem_sections(self) -> None: + rows = [ + ScorecardRow("t", _ADAPTER_A, "pass"), + ScorecardRow("t", _ADAPTER_B, "na"), + ] + result = GateResult(True, (), ()) + body = digest_body(result, rows) + assert "| Passed | Failed | N/A | Skipped |" in body + assert "| 1 | 0 | 1 | 0 |" in body + assert "Failing" not in body + assert "Missing" not in body + + def test_digest_body_lists_failing_and_missing_separately(self) -> None: + failing = ScorecardRow("t", _ADAPTER_A, "fail") + missing = ScorecardRow("t", _ADAPTER_B, "skip", "lane 'core'") + result = GateResult(False, (failing,), (missing,)) + body = digest_body(result, [failing, missing]) + assert "**Failing**" in body + assert f"`{_ADAPTER_A}`" in body.split("**Missing**")[0] + assert "**Missing** (lane ran, no result)" in body + assert f"`{_ADAPTER_B}`" in body.split("**Missing**")[1] + + def test_digest_body_never_renders_a_grid(self) -> None: + rows = [ScorecardRow("t", _ADAPTER_A, "fail")] + result = GateResult(False, (rows[0],), ()) + body = digest_body(result, rows) + assert "| test |" not in body + + def test_to_markdown_renders_grid_and_na_reasons(self) -> None: + md = to_markdown( + [ + ScorecardRow("m.py::test_x", "anthropic", "pass"), + ScorecardRow("m.py::test_x", "crewai", "na", "no per-turn usage"), + ] + ) + assert "| test | anthropic | crewai |" in md + assert "no per-turn usage" in md diff --git a/tests/framework_conformance/test_strands_nooa_job_coverage.py b/tests/framework_conformance/test_strands_nooa_job_coverage.py new file mode 100644 index 000000000..d639dd29e --- /dev/null +++ b/tests/framework_conformance/test_strands_nooa_job_coverage.py @@ -0,0 +1,73 @@ +"""The owning legacy job must collect every real legacy package consumer.""" + +from __future__ import annotations + +import importlib.util +import sys + +import pytest + +from tests.e2e.baseline.toolkit.deps import Extra +from tests.framework_configs.adapters import ADAPTER_CONFIGS +from tests.framework_configs.converters import CONVERTER_CONFIGS +from tests.framework_conformance import venv_job_coverage as coverage +from tests.paths import REPO_ROOT + + +class TestStrandsNooaJobCoverage: + @pytest.fixture + def framework_environment(self) -> None: + if ( + coverage.CoverageSettings().BAND_TEST_EXTRA != Extra.DEV_STRANDS_NOOA + and importlib.util.find_spec("strands") is None + ): + pytest.skip("covered by dev-strands-nooa") + + def test_expected_configs_are_present(self, framework_environment: None) -> None: + assert importlib.util.find_spec("strands") is not None + expected = {"strands"} + if sys.version_info[:2] in {(3, 12), (3, 13)} and sys.platform != "win32": + assert importlib.util.find_spec("nooa") is not None + expected.add("nooa") + assert expected <= {config.framework_id for config in ADAPTER_CONFIGS} + assert expected <= {config.framework_id for config in CONVERTER_CONFIGS} + + def test_job_selects_every_required_node(self, framework_environment: None) -> None: + needed = coverage.tests_needing_venv( + coverage.needs_venv_pattern(frozenset({"strands", "nooa"})) + ) + assert needed, "legacy dependency detection found no consumers" + assert all((REPO_ROOT / path).exists() for path in needed) + arguments = coverage.pytest_arguments( + coverage.job_command("test-strands-nooa", "Run Strands and NOOA tests") + ) + selected = coverage.selected_nodes(arguments) + # Directory collection honors NOOA's supported-platform conftest gate. + nooa_tests = REPO_ROOT / "tests/adapters/nooa" + targets = { + str(nooa_tests) if (REPO_ROOT / path).parent == nooa_tests else str(path) + for path in needed + } + baseline = coverage.collected_nodes( + [*sorted(targets), "tests/framework_conformance/"] + ) + needed_files = {path.as_posix() for path in needed} + required = { + node.nodeid + for node in baseline + if node.frameworks & {"strands", "nooa"} + or ( + not node.frameworks + and not node.skipped + and node.nodeid.split("::", 1)[0] in needed_files + ) + } + assert required, "no legacy nodes collected" + assert not required - selected, sorted(required - selected) + assert any("test_strands_injection_spike.py" in node for node in selected) + + def test_job_paths_exist(self) -> None: + command = coverage.job_command( + "test-strands-nooa", "Run Strands and NOOA tests" + ) + assert all((REPO_ROOT / path).exists() for path in coverage.job_paths(command)) diff --git a/tests/framework_conformance/test_turn_outcome.py b/tests/framework_conformance/test_turn_outcome.py index 6203fbf3b..4dd1e142f 100644 --- a/tests/framework_conformance/test_turn_outcome.py +++ b/tests/framework_conformance/test_turn_outcome.py @@ -1,262 +1,148 @@ -"""Every judged adapter's turn ends with core's verdict, not its own. - -Each probe (see ``turnprobes``) drives one scripted turn through the adapter's -real ``on_event``. A turn that replied, declined, did real work or was settled -by the adapter completes silently; a turn that did nothing is reported once -with core's missing-reply text and raised as ``TurnResultAlreadyReported``, so -the runtime marks it FAILED. The relaying adapters post the model's final text -unless a tool already replied; the rest discard it. - -To add an adapter: write its probe in ``turnprobes/.py`` and register it -in ``TURN_OUTCOME_PROBES``. ``test_every_judged_adapter_has_a_probe`` fails -when a judged adapter has none. -""" +"""TurnOutcome behavior.""" from __future__ import annotations -import importlib -import inspect -import pkgutil -from dataclasses import dataclass - import pytest from band_sdk_core import TurnVerdict -import band -from band.core.protocols import TurnResultAlreadyReported -from band.core.simple_adapter import SimpleAdapter -from band.runtime.tools import BandTool -from band.testing import MISSING_REPLY_FAILURE, failure_reports -from band.testing.fake_tools import FakeAgentTools, reported_failures +from band.testing import MISSING_REPLY_FAILURE +from band.testing.fake_tools import reported_failures from tests.framework_configs.adapters import ADAPTER_CONFIGS +from tests.framework_conformance.outcomeprobes import ( + ANSWER, + COMPLETING_SCRIPTS, + PINNED_OUTSIDE_CONFIGS, + REPLY, + TURN_OUTCOME_PROBES, + UNJUDGED_FRAMEWORK_IDS, + TurnResult, + band_adapters, + probe_params, + probe_running, + relaying_probe_params, + run_turn, +) from tests.framework_conformance.turnprobes import ( - ToolCall, - TurnOutcomeProbe, TurnScript, - acp, - claudesdk, - codex, - copilotsdk, - crewai, - letta, - opencode, - toolloop, turn_tools, ) -TURN_OUTCOME_PROBES: dict[str, TurnOutcomeProbe] = { - **acp.PROBES, - **claudesdk.PROBES, - **codex.PROBES, - **copilotsdk.PROBES, - **crewai.PROBES, - **letta.PROBES, - **opencode.PROBES, - **toolloop.PROBES, -} - -ANSWER = "The vault code is 4471-ECHO." -REPLY = ToolCall(BandTool.SEND_MESSAGE, {"content": ANSWER, "mentions": ["@alice"]}) - - -@dataclass(frozen=True) -class TurnResult: - verdict: TurnVerdict - messages: list[str] - failures: list[tuple[str, str]] - - -async def run_turn(probe: TurnOutcomeProbe, script: TurnScript) -> TurnResult: - tools = turn_tools() - try: - await probe.run(script, tools) - verdict = TurnVerdict.Complete - except TurnResultAlreadyReported: - verdict = TurnVerdict.MissingReply - return observed(tools, verdict) - - -def observed(tools: FakeAgentTools, verdict: TurnVerdict) -> TurnResult: - return TurnResult( - verdict=verdict, - messages=tools.chat, - failures=failure_reports(tools), - ) - - -COMPLETING_SCRIPTS = { - "decline": TurnScript((ToolCall(BandTool.NO_REPLY, {"reason": "FYI only"}),)), - "reply": TurnScript((REPLY,)), - "act": TurnScript((ToolCall(BandTool.CREATE_CHATROOM),)), -} - - -def probe_params() -> list[str]: - return sorted(TURN_OUTCOME_PROBES) - - -def relaying_probe_params() -> list[str]: - return [name for name in probe_params() if TURN_OUTCOME_PROBES[name].relays] - - -@pytest.mark.parametrize("framework_id", probe_params()) -@pytest.mark.parametrize("script_name", sorted(COMPLETING_SCRIPTS)) -async def test_a_turn_that_answered_or_worked_completes( - framework_id: str, script_name: str -) -> None: - result = await run_turn( - TURN_OUTCOME_PROBES[framework_id], COMPLETING_SCRIPTS[script_name] - ) - - assert result.verdict == TurnVerdict.Complete - assert result.failures == [] - - -@pytest.mark.parametrize("framework_id", probe_params()) -async def test_a_turn_that_did_nothing_is_reported_once(framework_id: str) -> None: - result = await run_turn(TURN_OUTCOME_PROBES[framework_id], TurnScript()) - - assert result.verdict == TurnVerdict.MissingReply - assert result.failures == [MISSING_REPLY_FAILURE] - assert result.messages == [] - - -@pytest.mark.parametrize( - "framework_id", - [name for name in probe_params() if TURN_OUTCOME_PROBES[name].settle], -) -async def test_an_adapter_settled_turn_completes(framework_id: str) -> None: - settle = TURN_OUTCOME_PROBES[framework_id].settle - assert settle is not None - tools = turn_tools() - - await settle(tools) - - assert tools.turn.complete - assert reported_failures(tools) == [] - -@pytest.mark.parametrize("framework_id", relaying_probe_params()) -async def test_a_relaying_adapter_posts_the_final_text_once(framework_id: str) -> None: - result = await run_turn( - TURN_OUTCOME_PROBES[framework_id], TurnScript(final_text=ANSWER) +class TestTurnOutcome: + @pytest.mark.parametrize("framework_id", probe_params()) + @pytest.mark.parametrize("script_name", sorted(COMPLETING_SCRIPTS)) + async def test_a_turn_that_answered_or_worked_completes( + self, framework_id: str, script_name: str + ) -> None: + result = await run_turn( + TURN_OUTCOME_PROBES[framework_id], COMPLETING_SCRIPTS[script_name] + ) + + assert result.verdict == TurnVerdict.Complete + assert result.failures == [] + + @pytest.mark.parametrize("framework_id", probe_params()) + async def test_a_turn_that_did_nothing_is_reported_once( + self, framework_id: str + ) -> None: + result = await run_turn(TURN_OUTCOME_PROBES[framework_id], TurnScript()) + + assert result.verdict == TurnVerdict.MissingReply + assert result.failures == [MISSING_REPLY_FAILURE] + assert result.messages == [] + + @pytest.mark.parametrize( + "framework_id", + [name for name in probe_params() if TURN_OUTCOME_PROBES[name].settle], ) - - assert result == TurnResult(TurnVerdict.Complete, messages=[ANSWER], failures=[]) - - -@pytest.mark.parametrize("framework_id", relaying_probe_params()) -async def test_a_tool_reply_suppresses_the_closing_text(framework_id: str) -> None: - result = await run_turn( - TURN_OUTCOME_PROBES[framework_id], - TurnScript((REPLY,), final_text="Anything else?"), - ) - - assert result == TurnResult(TurnVerdict.Complete, messages=[ANSWER], failures=[]) - - -@pytest.mark.parametrize("framework_id", ["acp", "cursor_acp", "codex"]) -async def test_native_text_cannot_complete_a_tool_authoritative_turn( - framework_id: str, -) -> None: - result = await run_turn( - TURN_OUTCOME_PROBES[framework_id], TurnScript(final_text=ANSWER) - ) - assert result == TurnResult(TurnVerdict.MissingReply, [], [MISSING_REPLY_FAILURE]) - - -@pytest.mark.parametrize("framework_id", ["acp", "cursor_acp", "codex"]) -@pytest.mark.parametrize("script_name", sorted(COMPLETING_SCRIPTS)) -async def test_native_text_preserves_successful_tool_outcomes( - framework_id: str, script_name: str -) -> None: - script = COMPLETING_SCRIPTS[script_name] - result = await run_turn( - TURN_OUTCOME_PROBES[framework_id], - TurnScript(script.tool_calls, final_text=ANSWER), - ) - assert result == TurnResult( - TurnVerdict.Complete, [ANSWER] if script_name == "reply" else [], [] - ) - - -#: Registered adapters whose turns are not the model's to answer through Band tools. -UNJUDGED_FRAMEWORK_IDS = frozenset({"crewai_flow", "parlant"}) - - -def test_only_the_declared_adapters_go_unjudged() -> None: - unjudged = { - cfg.framework_id - for cfg in ADAPTER_CONFIGS - if not cfg.adapter_factory().judges_turns - } - - assert unjudged == UNJUDGED_FRAMEWORK_IDS - - -#: Judged adapters outside ADAPTER_CONFIGS, by the probe that runs their rows. -#: A subclass that inherits one of these ``on_message`` methods is covered too. -PROBED_OUTSIDE_CONFIGS = {"ACPClientAdapter": "acp", "CursorACPAdapter": "cursor_acp"} - -#: Adapters outside ADAPTER_CONFIGS whose verdict their own tests pin. -PINNED_OUTSIDE_CONFIGS = { - "SlackAdapter": "its brain's verdict (tests/integrations/slack)", - "A2AAdapter": "unjudged (tests/integrations/a2a)", - "A2AGatewayAdapter": "unjudged (tests/integrations/a2a/gateway)", - "BandACPServerAdapter": "unjudged (tests/integrations/acp)", -} - - -def band_adapters() -> dict[str, type[SimpleAdapter]]: - """Every concrete SimpleAdapter defined in band whose module imports here.""" - for module in pkgutil.walk_packages(band.__path__, "band."): - if module.name.endswith("__main__"): - continue - try: - importlib.import_module(module.name) - except ModuleNotFoundError as missing: - if (missing.name or "").startswith("band"): - raise - continue # an extra this venv lacks; its own lane covers it - pending, adapters = [SimpleAdapter], {} - while pending: - for cls in pending.pop().__subclasses__(): - pending.append(cls) - if cls.__module__.startswith("band.") and not inspect.isabstract(cls): - adapters[cls.__name__] = cls - return adapters - - -def probe_running( - cls: type[SimpleAdapter], adapters: dict[str, type[SimpleAdapter]] -) -> str | None: - """The probe that runs ``cls``'s turn, via the ``on_message`` it uses.""" - for name, probe in PROBED_OUTSIDE_CONFIGS.items(): - owner = adapters.get(name) - if owner and issubclass(cls, owner) and cls.on_message is owner.on_message: - return probe - return None - - -def test_every_band_adapter_is_registered_probed_or_pinned() -> None: - registered = {type(cfg.adapter_factory()).__name__ for cfg in ADAPTER_CONFIGS} - adapters = band_adapters() - unprobed = { - name - for name, cls in adapters.items() - if name not in registered - and probe_running(cls, adapters) not in TURN_OUTCOME_PROBES - } - - assert unprobed == set(PINNED_OUTSIDE_CONFIGS) - - -def test_every_judged_adapter_has_a_probe() -> None: - unprobed = sorted( - cfg.framework_id - for cfg in ADAPTER_CONFIGS - if cfg.adapter_factory().judges_turns - and cfg.framework_id not in TURN_OUTCOME_PROBES - ) - - assert unprobed == [] + async def test_an_adapter_settled_turn_completes(self, framework_id: str) -> None: + settle = TURN_OUTCOME_PROBES[framework_id].settle + assert settle is not None + tools = turn_tools() + + await settle(tools) + + assert tools.turn.complete + assert reported_failures(tools) == [] + + @pytest.mark.parametrize("framework_id", relaying_probe_params()) + async def test_a_relaying_adapter_posts_the_final_text_once( + self, framework_id: str + ) -> None: + result = await run_turn( + TURN_OUTCOME_PROBES[framework_id], TurnScript(final_text=ANSWER) + ) + + assert result == TurnResult( + TurnVerdict.Complete, messages=[ANSWER], failures=[] + ) + + @pytest.mark.parametrize("framework_id", relaying_probe_params()) + async def test_a_tool_reply_suppresses_the_closing_text( + self, framework_id: str + ) -> None: + result = await run_turn( + TURN_OUTCOME_PROBES[framework_id], + TurnScript((REPLY,), final_text="Anything else?"), + ) + + assert result == TurnResult( + TurnVerdict.Complete, messages=[ANSWER], failures=[] + ) + + @pytest.mark.parametrize("framework_id", ["acp", "cursor_acp", "codex"]) + async def test_native_text_cannot_complete_a_tool_authoritative_turn( + self, + framework_id: str, + ) -> None: + result = await run_turn( + TURN_OUTCOME_PROBES[framework_id], TurnScript(final_text=ANSWER) + ) + assert result == TurnResult( + TurnVerdict.MissingReply, [], [MISSING_REPLY_FAILURE] + ) + + @pytest.mark.parametrize("framework_id", ["acp", "cursor_acp", "codex"]) + @pytest.mark.parametrize("script_name", sorted(COMPLETING_SCRIPTS)) + async def test_native_text_preserves_successful_tool_outcomes( + self, framework_id: str, script_name: str + ) -> None: + script = COMPLETING_SCRIPTS[script_name] + result = await run_turn( + TURN_OUTCOME_PROBES[framework_id], + TurnScript(script.tool_calls, final_text=ANSWER), + ) + assert result == TurnResult( + TurnVerdict.Complete, [ANSWER] if script_name == "reply" else [], [] + ) + + def test_only_the_declared_adapters_go_unjudged(self) -> None: + unjudged = { + cfg.framework_id + for cfg in ADAPTER_CONFIGS + if not cfg.adapter_factory().judges_turns + } + + assert unjudged == UNJUDGED_FRAMEWORK_IDS + + def test_every_band_adapter_is_registered_probed_or_pinned(self) -> None: + registered = {type(cfg.adapter_factory()).__name__ for cfg in ADAPTER_CONFIGS} + adapters = band_adapters() + unprobed = { + name + for name, cls in adapters.items() + if name not in registered + and probe_running(cls, adapters) not in TURN_OUTCOME_PROBES + } + + assert unprobed == set(PINNED_OUTSIDE_CONFIGS) + + def test_every_judged_adapter_has_a_probe(self) -> None: + unprobed = sorted( + cfg.framework_id + for cfg in ADAPTER_CONFIGS + if cfg.adapter_factory().judges_turns + and cfg.framework_id not in TURN_OUTCOME_PROBES + ) + + assert unprobed == [] diff --git a/tests/framework_conformance/venv_job_coverage.py b/tests/framework_conformance/venv_job_coverage.py index de8db2020..9b70097f6 100644 --- a/tests/framework_conformance/venv_job_coverage.py +++ b/tests/framework_conformance/venv_job_coverage.py @@ -1,31 +1,33 @@ -"""Shared machinery for the `test__job_coverage.py` drift guards. - -A framework whose deps conflict with the rest of `dev` (crewai, parlant) lives in -its own venv (`dev-crewai`, `dev-parlant`), which cannot import the other -frameworks — so its CI job cannot just run `pytest`, it names the test files one -by one. That list is the only thing standing between one of its tests and never -running anywhere: the default `test` job skips whatever needs the isolated venv's -deps, and the isolated job only collects what its list names. A file dropped from -it goes silently uncovered (this happened once, to the crewai cases in -`test_capability_gating_e2e.py`). - -So each per-framework guard derives the set that *needs* its venv from the tests -themselves — via the deps only that venv has — and asserts the workflow covers -every one. This module holds the generic mechanics; `test_crewai_job_coverage.py` -and `test_parlant_job_coverage.py` supply the framework-specific module names and -job/step identifiers. -""" +"""Coverage of isolated jobs, derived from real consumers and pytest selection.""" from __future__ import annotations +import ast +import json import re +import shlex +import subprocess +import sys +import tempfile import tomllib +from dataclasses import dataclass from pathlib import Path +import pytest import yaml +from pydantic_settings import BaseSettings, SettingsConfigDict +from tests.e2e.baseline.toolkit.deps import Extra from tests.paths import REPO_ROOT + +class CoverageSettings(BaseSettings): + model_config = SettingsConfigDict( + extra="ignore", case_sensitive=False, env_ignore_empty=True + ) + BAND_TEST_EXTRA: Extra | None = None + + CI_WORKFLOW = REPO_ROOT / ".github/workflows/ci.yml" _TESTS_ROOT = REPO_ROOT / "tests" @@ -59,17 +61,38 @@ def name(requirement: str) -> str: return {name(r) for r in extras[extra]} - {name(r) for r in extras[baseline_extra]} -def tests_needing_venv(pattern: re.Pattern[str]) -> set[Path]: - """Repo-relative unit-test files that only a venv matching ``pattern`` can run. +def consumer_source(path: Path, visited: set[Path] | None = None) -> str: + """Include same-suite helpers so extracting a probe cannot hide its consumers.""" + seen = visited if visited is not None else set() + if path in seen: + return "" + seen.add(path) + source = path.read_text(encoding="utf-8") + helpers = { + REPO_ROOT.joinpath(*node.module.split(".")).with_suffix(".py") + for node in ast.walk(ast.parse(source)) + if isinstance(node, ast.ImportFrom) + and node.module is not None + and node.module.startswith("tests.") + } + return ( + source + + "\n" + + "\n".join( + consumer_source(helper, seen) + for helper in sorted(helpers) + if helper.parent == path.parent and helper.exists() + ) + ) - `tests/e2e/**` is excluded: those run from the e2e workflow's own lane, not a - ci.yml job. - """ + +def tests_needing_venv(pattern: re.Pattern[str]) -> set[Path]: + """Unit-test consumers of a real dependency, including their shared probes.""" return { path.relative_to(REPO_ROOT) for path in _TESTS_ROOT.rglob("test_*.py") if "e2e" not in path.relative_to(_TESTS_ROOT).parts - and pattern.search(path.read_text(encoding="utf-8")) + and pattern.search(consumer_source(path)) } @@ -98,3 +121,87 @@ def covered_by(target: Path, listed: set[Path], command: str) -> bool: return not _KEYWORD_FILTER.search(command) and any( parent in listed for parent in target.parents ) + + +@dataclass(frozen=True) +class CollectedNode: + nodeid: str + frameworks: frozenset[str] + skipped: bool + + +def collected_nodes(arguments: list[str]) -> tuple[CollectedNode, ...]: + """Collect nodes and framework bindings after pytest applies the job selectors.""" + with tempfile.TemporaryDirectory() as directory: + output = Path(directory) / "nodes.json" + result = subprocess.run( + [ + sys.executable, + "-m", + "tests.framework_conformance.venv_job_coverage", + str(output), + *arguments, + ], + cwd=REPO_ROOT, + capture_output=True, + text=True, + check=False, + ) + if result.returncode != 0: + raise AssertionError(result.stdout + result.stderr) + return tuple( + CollectedNode(row["nodeid"], frozenset(row["frameworks"]), row["skipped"]) + for row in json.loads(output.read_text(encoding="utf-8")) + ) + + +def selected_nodes(arguments: list[str]) -> set[str]: + """The exact node IDs surviving a job's pytest selectors.""" + return {node.nodeid for node in collected_nodes(arguments)} + + +def framework_bindings(item: pytest.Item) -> set[str]: + """Read actual parametrized framework identities, independent of node names.""" + params = getattr(getattr(item, "callspec", None), "params", {}) + return { + str(value.framework_id) if hasattr(value, "framework_id") else str(value) + for name, value in params.items() + if name in {"framework_id", "adapter_id", "adapter_config", "converter_config"} + } + + +def collection_row(item: pytest.Item) -> dict[str, object]: + skipped = item.get_closest_marker("skip") is not None or any( + marker.args and marker.args[0] is True for marker in item.iter_markers("skipif") + ) + return { + "nodeid": item.nodeid, + "frameworks": sorted(framework_bindings(item)), + "skipped": skipped, + } + + +def pytest_arguments(command: str) -> list[str]: + """Read selectors after the workflow's pytest executable.""" + tokens = shlex.split(command) + return tokens[tokens.index("pytest") + 1 :] + + +class NodeCollector: + def __init__(self, output: Path) -> None: + self.output = output + + def pytest_collection_finish(self, session: pytest.Session) -> None: + self.output.write_text( + json.dumps([collection_row(item) for item in session.items]), + encoding="utf-8", + ) + + +if __name__ == "__main__": + raise SystemExit( + pytest.main( + [*sys.argv[2:], "--collect-only", "--no-cov"], + plugins=[NodeCollector(Path(sys.argv[1]))], + ) + ) diff --git a/tests/integrations/langgraph/declinekit.py b/tests/integrations/langgraph/declinekit.py new file mode 100644 index 000000000..a679b5330 --- /dev/null +++ b/tests/integrations/langgraph/declinekit.py @@ -0,0 +1,55 @@ +"""Native chat model and tool outcomes for explicit-decline regressions.""" + +from __future__ import annotations + +from collections.abc import Sequence +from enum import StrEnum +from typing import Any + +from langchain_core.language_models.fake_chat_models import GenericFakeChatModel +from langchain_core.outputs import ChatResult + +from band.runtime.tools import BandTool +from band.testing import FakeAgentTools + + +class DeclineFailure(StrEnum): + INVALID_ARGUMENTS = "invalid-decline" + RAISED_DECLINE = "raised-decline" + STRUCTURED_DECLINE = "structured-decline" + FAILED_SIBLING = "failed-sibling" + + +class ScriptedModel(GenericFakeChatModel): + requests: int = 0 + + def bind_tools(self, tools: Sequence[Any], **kwargs: Any) -> ScriptedModel: + return self + + def _generate(self, *args: Any, **kwargs: Any) -> ChatResult: + self.requests += 1 + return super()._generate(*args, **kwargs) + + +class DeclineTools(FakeAgentTools): + def __init__(self, failure: DeclineFailure | None = None) -> None: + super().__init__() + self.failure = failure + + @property + def replies(self) -> list[str]: + return [ + call["arguments"]["content"] + for call in self.tool_calls + if call["tool_name"] == BandTool.SEND_MESSAGE + ] + + async def execute_tool_call(self, tool_name: str, arguments: dict[str, Any]) -> Any: + match (self.failure, tool_name): + case (DeclineFailure.RAISED_DECLINE, BandTool.NO_REPLY): + raise RuntimeError("decline rejected") + case (DeclineFailure.STRUCTURED_DECLINE, BandTool.NO_REPLY): + return {"ok": False} + case (DeclineFailure.FAILED_SIBLING, BandTool.GET_PARTICIPANTS): + raise RuntimeError("sibling rejected") + return await super().execute_tool_call(tool_name, arguments) diff --git a/tests/integrations/langgraph/test_decline.py b/tests/integrations/langgraph/test_decline.py new file mode 100644 index 000000000..316c9e860 --- /dev/null +++ b/tests/integrations/langgraph/test_decline.py @@ -0,0 +1,147 @@ +"""A successful decline ends the native graph without another model request.""" + +from __future__ import annotations + +from datetime import UTC, datetime + +import pytest +from langchain_core.messages import AIMessage + +from band.adapters.langgraph import LangGraphAdapter +from band.core.types import PlatformMessage +from band.runtime.tools import BandTool +from tests.integrations.langgraph.declinekit import ( + DeclineFailure, + DeclineTools, + ScriptedModel, +) + + +class TestExplicitDecline: + @pytest.fixture + def message(self) -> PlatformMessage: + return PlatformMessage( + id="message", + room_id="room-fake", + content="FYI", + sender_id="user", + sender_type="User", + sender_name="User", + message_type="text", + metadata={}, + created_at=datetime.now(UTC), + ) + + @pytest.mark.parametrize( + "failure", + [None, *DeclineFailure], + ) + async def test_only_a_successful_batch_is_terminal( + self, message: PlatformMessage, failure: DeclineFailure | None + ) -> None: + calls = [ + { + "name": BandTool.NO_REPLY, + "args": { + "reason": 42 + if failure == DeclineFailure.INVALID_ARGUMENTS + else "FYI" + }, + "id": "decline", + } + ] + if failure == DeclineFailure.FAILED_SIBLING: + calls.append( + {"name": BandTool.GET_PARTICIPANTS, "args": {}, "id": "sibling"} + ) + model = ScriptedModel( + messages=iter( + [ + AIMessage(content="", tool_calls=calls), + AIMessage( + content="", + tool_calls=[ + { + "name": BandTool.SEND_MESSAGE, + "args": { + "content": "fresh reply", + "mentions": [ + "00000000-0000-0000-0000-000000000001" + ], + }, + "id": "reply", + } + ], + ), + AIMessage(content="done"), + ] + ), + disable_streaming=True, + ) + adapter = LangGraphAdapter(llm=model) + tools = DeclineTools(failure) + await adapter.on_started("Bot", "Bot") + await adapter.run_judged_turn( + msg=message, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=True, + room_id=tools.room_id, + ) + assert model.requests == (1 if failure is None else 3) + assert tools.turn.replied + assert tools.replies == ([] if failure is None else ["fresh reply"]) + + async def test_a_previous_decline_does_not_end_the_next_turn( + self, message: PlatformMessage + ) -> None: + model = ScriptedModel( + messages=iter( + [ + AIMessage( + content="", + tool_calls=[ + { + "name": BandTool.NO_REPLY, + "args": {"reason": "FYI"}, + "id": "decline", + } + ], + ), + AIMessage( + content="", + tool_calls=[ + { + "name": BandTool.SEND_MESSAGE, + "args": { + "content": "fresh reply", + "mentions": [ + "00000000-0000-0000-0000-000000000001" + ], + }, + "id": "reply", + } + ], + ), + AIMessage(content="done"), + ] + ), + disable_streaming=True, + ) + adapter = LangGraphAdapter(llm=model) + await adapter.on_started("Bot", "Bot") + for bootstrap in (True, False): + tools = DeclineTools() + await adapter.run_judged_turn( + msg=message, + tools=tools, + history=[], + participants_msg=None, + contacts_msg=None, + is_session_bootstrap=bootstrap, + room_id=tools.room_id, + ) + assert model.requests == 3 + assert tools.replies == ["fresh reply"] diff --git a/uv.lock b/uv.lock index 73cca6e45..fb5df03d2 100644 --- a/uv.lock +++ b/uv.lock @@ -1,15 +1,77 @@ version = 1 -revision = 3 +revision = 5 requires-python = ">=3.11" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", ] required-markers = [ "platform_machine == 'arm64' and sys_platform == 'darwin'", @@ -53,6 +115,33 @@ conflicts = [[ ], [ { package = "band-sdk", extra = "crewai" }, { package = "band-sdk", extra = "dev-parlant" }, +], [ + { package = "band-sdk", extra = "dev" }, + { package = "band-sdk", extra = "strands" }, +], [ + { package = "band-sdk", extra = "dev" }, + { package = "band-sdk", extra = "nooa" }, +], [ + { package = "band-sdk", extra = "dev" }, + { package = "band-sdk", extra = "dev-strands-nooa" }, +], [ + { package = "band-sdk", extra = "pydantic-ai" }, + { package = "band-sdk", extra = "strands" }, +], [ + { package = "band-sdk", extra = "nooa" }, + { package = "band-sdk", extra = "pydantic-ai" }, +], [ + { package = "band-sdk", extra = "dev-strands-nooa" }, + { package = "band-sdk", extra = "pydantic-ai" }, +], [ + { package = "band-sdk", extra = "dev-parlant" }, + { package = "band-sdk", extra = "strands" }, +], [ + { package = "band-sdk", extra = "dev-parlant" }, + { package = "band-sdk", extra = "nooa" }, +], [ + { package = "band-sdk", extra = "dev-parlant" }, + { package = "band-sdk", extra = "dev-strands-nooa" }, ]] [manifest] @@ -70,7 +159,7 @@ name = "a2a-sdk" version = "1.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "culsans", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "culsans", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "google-api-core" }, { name = "googleapis-common-protos" }, { name = "httpx" }, @@ -124,7 +213,7 @@ dependencies = [ { name = "pydantic" }, { name = "pydantic-settings" }, { name = "pyyaml" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "typing-extensions" }, ] @@ -140,7 +229,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, { name = "questionary" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "typer" }, ] @@ -154,7 +243,7 @@ name = "aiofile" version = "3.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "caio" }, + { name = "caio", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } wheels = [ @@ -168,11 +257,10 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } @@ -185,14 +273,27 @@ name = "aiofiles" version = "25.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", ] sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } wheels = [ @@ -219,7 +320,7 @@ dependencies = [ { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "yarl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/93/2f/6a91adaa2dc26877d6ed2f54c0370c8910f019db7d77c5c6a194611e93ea/aiohttp-3.14.4.tar.gz", hash = "sha256:831fc5bd39ec2517851e348f613ddb5447a47cf4b71cb09845af7ad7ed45d8f9", size = 8077839, upload-time = "2026-10-05T17:43:48.309Z" } @@ -373,9 +474,9 @@ name = "aiologic" version = "0.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "sniffio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "wrapt", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "sniffio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "wrapt", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f1/7a/d51f2fde1e8ae8a83431f8e97b7a71e9358cdb1d4d2ce6be387fa44d68de/aiologic-0.17.1.tar.gz", hash = "sha256:2e1b93b9e88ced318c2a63ad7b382688f40cbfe40e3d42258d49dc9c5aea179d", size = 252354, upload-time = "2026-06-27T20:41:33.25Z" } wheels = [ @@ -387,13 +488,13 @@ name = "aiopenapi3" version = "0.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "email-validator" }, - { name = "httpx" }, - { name = "jmespath" }, - { name = "more-itertools" }, - { name = "pydantic" }, - { name = "pyyaml" }, - { name = "yarl" }, + { name = "email-validator", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jmespath", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "more-itertools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyyaml", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "yarl", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/bc/b5be54133ebc97d46e2c50dc2b788e6146bde85a3f681608cd850381ea43/aiopenapi3-0.8.1.tar.gz", hash = "sha256:ef9a84b6a45f72e3016b74621025e5b1c6cb9a3c5da5b77998ddf16e2decd4c4", size = 68670, upload-time = "2025-04-19T07:44:28.016Z" } wheels = [ @@ -415,7 +516,7 @@ version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ @@ -460,8 +561,8 @@ dependencies = [ { name = "anyio" }, { name = "docstring-parser" }, { name = "httpx2" }, - { name = "jiter", version = "0.13.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "jiter", version = "0.14.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, + { name = "jiter", version = "0.13.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jiter", version = "0.17.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "pydantic" }, { name = "sniffio" }, { name = "typing-extensions" }, @@ -477,7 +578,7 @@ version = "4.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } wheels = [ @@ -576,7 +677,7 @@ source = { editable = "packages/band-mcp" } dependencies = [ { name = "band-client-rest" }, { name = "band-sdk" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, extra = ["cli"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, extra = ["cli"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, extra = ["cli"], marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "pydantic-settings" }, { name = "typer" }, @@ -602,8 +703,8 @@ dependencies = [ { name = "band-client-rest" }, { name = "band-sdk-core" }, { name = "cryptography" }, - { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32') or (python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "phoenix-channels-python-client" }, { name = "pydantic" }, { name = "pydantic-settings" }, @@ -632,7 +733,7 @@ a2a-gateway-demo = [ ] acp = [ { name = "agent-client-protocol" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "starlette" }, { name = "uvicorn" }, @@ -660,7 +761,7 @@ bridge-agentcore = [ ] claude-sdk = [ { name = "claude-agent-sdk" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] codex = [ @@ -672,11 +773,11 @@ copilot-sdk = [ crewai = [ { name = "crewai" }, { name = "nest-asyncio" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, { name = "pillow" }, ] desktop = [ - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] dev = [ @@ -693,8 +794,8 @@ dev = [ { name = "commitizen" }, { name = "github-copilot-sdk" }, { name = "google-adk" }, - { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.13' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.13' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "httpx" }, { name = "langchain" }, { name = "langchain-anthropic" }, @@ -706,14 +807,13 @@ dev = [ { name = "letta-client" }, { name = "looptime" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" } }, - { name = "nooa", marker = "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32'" }, - { name = "openai" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" } }, { name = "opentelemetry-instrumentation-logging" }, { name = "opentelemetry-resourcedetector-gcp" }, { name = "opentelemetry-sdk" }, { name = "packaging" }, { name = "pre-commit" }, - { name = "pydantic-ai-slim" }, + { name = "pydantic-ai-slim", extra = ["anthropic", "openai"], marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "pydantic-settings" }, { name = "pyrefly" }, { name = "pytest" }, @@ -730,7 +830,6 @@ dev = [ { name = "ruff" }, { name = "slack-sdk" }, { name = "starlette" }, - { name = "strands-agents", extra = ["openai"], marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, { name = "tenacity" }, { name = "uvicorn" }, ] @@ -742,7 +841,7 @@ dev-crewai = [ { name = "httpx" }, { name = "looptime" }, { name = "nest-asyncio" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, { name = "pillow" }, { name = "pydantic-settings" }, { name = "pyrefly" }, @@ -762,7 +861,7 @@ dev-parlant = [ { name = "band-testing-python" }, { name = "httpx" }, { name = "looptime" }, - { name = "openai" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" } }, { name = "parlant" }, { name = "pydantic-settings" }, { name = "pyrefly" }, @@ -777,14 +876,45 @@ dev-parlant = [ { name = "tenacity" }, { name = "werkzeug" }, ] +dev-strands-nooa = [ + { name = "a2a-sdk" }, + { name = "anthropic" }, + { name = "band-testing-python" }, + { name = "beautifulsoup4" }, + { name = "httpx" }, + { name = "langchain" }, + { name = "langchain-anthropic" }, + { name = "langchain-community" }, + { name = "langchain-core" }, + { name = "langchain-openai" }, + { name = "langchain-text-splitters" }, + { name = "langgraph" }, + { name = "looptime" }, + { name = "nooa", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pydantic-settings" }, + { name = "pyrefly" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-markdown-docs" }, + { name = "pytest-mock" }, + { name = "pytest-rerunfailures" }, + { name = "pytest-timeout" }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "ruff" }, + { name = "strands-agents", extra = ["openai"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "tenacity" }, +] gemini = [ - { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] google-adk = [ { name = "google-adk" }, - { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "opentelemetry-resourcedetector-gcp" }, ] langgraph = [ @@ -796,34 +926,37 @@ langgraph = [ { name = "langchain-openai" }, { name = "langchain-text-splitters" }, { name = "langgraph" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] letta = [ { name = "letta-client" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] logging = [ { name = "python-json-logger" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] nooa = [ - { name = "nooa", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "nooa", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] opencode = [ { name = "httpx" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] parlant = [ - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "parlant" }, { name = "werkzeug" }, ] pydantic-ai = [ - { name = "openai" }, - { name = "pydantic-ai-slim", extra = ["anthropic"], marker = "extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" } }, + { name = "pydantic-ai-slim", extra = ["anthropic", "openai"], marker = "extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands')" }, ] slack = [ { name = "aiohttp" }, @@ -832,8 +965,8 @@ slack = [ { name = "uvicorn" }, ] strands = [ - { name = "openai" }, - { name = "strands-agents", extra = ["openai"] }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, + { name = "strands-agents", extra = ["openai"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, ] [package.metadata] @@ -842,6 +975,7 @@ requires-dist = [ { name = "a2a-sdk", marker = "extra == 'dev'", specifier = ">=1.1.2,<2" }, { name = "a2a-sdk", marker = "extra == 'dev-crewai'", specifier = ">=1.1.2,<2" }, { name = "a2a-sdk", marker = "extra == 'dev-parlant'", specifier = ">=1.1.2,<2" }, + { name = "a2a-sdk", marker = "extra == 'dev-strands-nooa'", specifier = ">=1.1.2,<2" }, { name = "a2a-sdk", extras = ["http-server"], marker = "extra == 'a2a-gateway'", specifier = ">=1.1.2,<2" }, { name = "a2a-sdk", extras = ["http-server"], marker = "extra == 'a2a-gateway-demo'", specifier = ">=1.1.2,<2" }, { name = "agent-client-protocol", marker = "extra == 'acp'", specifier = ">=0.11.0" }, @@ -856,13 +990,16 @@ requires-dist = [ { name = "anthropic", marker = "extra == 'dev'", specifier = ">=0.75.0,<2" }, { name = "anthropic", marker = "extra == 'dev-crewai'", specifier = ">=0.75.0,<2" }, { name = "anthropic", marker = "extra == 'dev-parlant'", specifier = ">=0.75.0,<2" }, + { name = "anthropic", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.75.0,<2" }, { name = "async-lru", specifier = ">=2.3.0" }, { name = "band-client-rest", specifier = "==0.0.46" }, { name = "band-sdk-core", specifier = "==2.8.0" }, { name = "band-testing-python", marker = "extra == 'dev'", specifier = "==0.1.4" }, { name = "band-testing-python", marker = "extra == 'dev-crewai'", specifier = "==0.1.4" }, { name = "band-testing-python", marker = "extra == 'dev-parlant'", specifier = "==0.1.4" }, + { name = "band-testing-python", marker = "extra == 'dev-strands-nooa'", specifier = "==0.1.4" }, { name = "beautifulsoup4", marker = "extra == 'dev'", specifier = ">=4.12.0" }, + { name = "beautifulsoup4", marker = "extra == 'dev-strands-nooa'", specifier = ">=4.12.0" }, { name = "beautifulsoup4", marker = "extra == 'langgraph'", specifier = ">=4.12.0" }, { name = "boto3", marker = "extra == 'bridge-agentcore'", specifier = ">=1.35.0" }, { name = "boto3", marker = "extra == 'dev'", specifier = ">=1.35.0" }, @@ -888,28 +1025,37 @@ requires-dist = [ { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.24.0" }, { name = "httpx", marker = "extra == 'dev-crewai'", specifier = ">=0.24.0" }, { name = "httpx", marker = "extra == 'dev-parlant'", specifier = ">=0.24.0" }, + { name = "httpx", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.24.0" }, { name = "httpx", marker = "extra == 'opencode'", specifier = ">=0.24.0" }, { name = "langchain", marker = "extra == 'dev'", specifier = ">=1.0.0" }, + { name = "langchain", marker = "extra == 'dev-strands-nooa'", specifier = ">=1.0.0" }, { name = "langchain", marker = "extra == 'langgraph'", specifier = ">=1.0.0" }, { name = "langchain-anthropic", marker = "extra == 'dev'", specifier = ">=0.3.0" }, + { name = "langchain-anthropic", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.3.0" }, { name = "langchain-anthropic", marker = "extra == 'langgraph'", specifier = ">=0.3.0" }, { name = "langchain-community", marker = "extra == 'dev'", specifier = ">=0.4.0" }, + { name = "langchain-community", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.4.0" }, { name = "langchain-community", marker = "extra == 'langgraph'", specifier = ">=0.4.0" }, { name = "langchain-core", marker = "extra == 'dev'", specifier = ">=1.2.11" }, + { name = "langchain-core", marker = "extra == 'dev-strands-nooa'", specifier = ">=1.2.11" }, { name = "langchain-core", marker = "extra == 'langgraph'", specifier = ">=1.2.11" }, - { name = "langchain-openai", marker = "extra == 'a2a-gateway-demo'", specifier = ">=0.3.0" }, - { name = "langchain-openai", marker = "extra == 'dev'", specifier = ">=0.3.0" }, - { name = "langchain-openai", marker = "extra == 'langgraph'", specifier = ">=0.3.0" }, + { name = "langchain-openai", marker = "extra == 'a2a-gateway-demo'", specifier = ">=1.5.0" }, + { name = "langchain-openai", marker = "extra == 'dev'", specifier = ">=1.5.0" }, + { name = "langchain-openai", marker = "extra == 'dev-strands-nooa'", specifier = ">=1.5.0" }, + { name = "langchain-openai", marker = "extra == 'langgraph'", specifier = ">=1.5.0" }, { name = "langchain-text-splitters", marker = "extra == 'dev'", specifier = ">=0.3.0" }, + { name = "langchain-text-splitters", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.3.0" }, { name = "langchain-text-splitters", marker = "extra == 'langgraph'", specifier = ">=0.3.0" }, { name = "langgraph", marker = "extra == 'a2a-gateway-demo'", specifier = ">=1.0.0" }, { name = "langgraph", marker = "extra == 'dev'", specifier = ">=1.0.0" }, + { name = "langgraph", marker = "extra == 'dev-strands-nooa'", specifier = ">=1.0.0" }, { name = "langgraph", marker = "extra == 'langgraph'", specifier = ">=1.0.0" }, { name = "letta-client", marker = "extra == 'dev'", specifier = ">=1.0.0" }, { name = "letta-client", marker = "extra == 'letta'", specifier = ">=1.0.0" }, { name = "looptime", marker = "extra == 'dev'", specifier = ">=0.7" }, { name = "looptime", marker = "extra == 'dev-crewai'", specifier = ">=0.7" }, { name = "looptime", marker = "extra == 'dev-parlant'", specifier = ">=0.7" }, + { name = "looptime", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.7" }, { name = "mcp", marker = "extra == 'acp'", specifier = ">=1.28.1,<2" }, { name = "mcp", marker = "extra == 'claude-sdk'", specifier = ">=1.28.1,<2" }, { name = "mcp", marker = "extra == 'desktop'", specifier = ">=1.28.1,<2" }, @@ -918,16 +1064,18 @@ requires-dist = [ { name = "mcp", marker = "extra == 'opencode'", specifier = ">=1.28.1,<2" }, { name = "nest-asyncio", marker = "extra == 'crewai'", specifier = ">=1.6.0" }, { name = "nest-asyncio", marker = "extra == 'dev-crewai'", specifier = ">=1.6.0" }, - { name = "nooa", marker = "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'dev'", specifier = ">=0.0.10,<0.1" }, + { name = "nooa", marker = "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'dev-strands-nooa'", specifier = ">=0.0.10,<0.1" }, { name = "nooa", marker = "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'nooa'", specifier = ">=0.0.10,<0.1" }, - { name = "openai", marker = "extra == 'crewai'", specifier = ">=2.0.0" }, - { name = "openai", marker = "extra == 'dev'", specifier = ">=2.0.0" }, - { name = "openai", marker = "extra == 'dev-crewai'", specifier = ">=2.0.0" }, - { name = "openai", marker = "extra == 'dev-parlant'", specifier = ">=2.0.0" }, + { name = "openai", marker = "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'nooa'", specifier = ">=2.0.0,<3" }, + { name = "openai", marker = "extra == 'crewai'", specifier = ">=2.0.0,<3" }, + { name = "openai", marker = "extra == 'dev'", specifier = ">=3.26.0,<4" }, + { name = "openai", marker = "extra == 'dev-crewai'", specifier = ">=2.0.0,<3" }, + { name = "openai", marker = "extra == 'dev-parlant'", specifier = ">=3.26.0,<4" }, + { name = "openai", marker = "extra == 'dev-strands-nooa'", specifier = ">=2.0.0,<3" }, { name = "openai", marker = "extra == 'langgraph'", specifier = ">=2.0.0" }, { name = "openai", marker = "extra == 'parlant'", specifier = ">=2.0.0" }, - { name = "openai", marker = "extra == 'pydantic-ai'", specifier = ">=2.0.0" }, - { name = "openai", marker = "extra == 'strands'", specifier = ">=2.0.0" }, + { name = "openai", marker = "extra == 'pydantic-ai'", specifier = ">=3.26.0,<4" }, + { name = "openai", marker = "extra == 'strands'", specifier = ">=2.0.0,<3" }, { name = "opentelemetry-instrumentation-logging", marker = "extra == 'dev'", specifier = ">=0.65b0" }, { name = "opentelemetry-resourcedetector-gcp", marker = "extra == 'dev'", specifier = ">=1.12.0a0,!=1.13.0" }, { name = "opentelemetry-resourcedetector-gcp", marker = "extra == 'google-adk'", specifier = ">=1.12.0a0,!=1.13.0" }, @@ -940,35 +1088,44 @@ requires-dist = [ { name = "pillow", marker = "extra == 'dev-crewai'", specifier = ">=12.1.1" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.0.0" }, { name = "pydantic", specifier = ">=2.0" }, - { name = "pydantic-ai-slim", marker = "extra == 'dev'", specifier = ">=2.18.0" }, - { name = "pydantic-ai-slim", extras = ["anthropic"], marker = "extra == 'pydantic-ai'", specifier = ">=2.18.0" }, + { name = "pydantic-ai-slim", extras = ["anthropic", "openai"], marker = "extra == 'dev'", specifier = ">=2.55.0" }, + { name = "pydantic-ai-slim", extras = ["anthropic", "openai"], marker = "extra == 'pydantic-ai'", specifier = ">=2.55.0" }, { name = "pydantic-settings", specifier = ">=2.0.0" }, { name = "pydantic-settings", marker = "extra == 'dev'", specifier = ">=2.0.0" }, { name = "pydantic-settings", marker = "extra == 'dev-crewai'", specifier = ">=2.0.0" }, { name = "pydantic-settings", marker = "extra == 'dev-parlant'", specifier = ">=2.0.0" }, + { name = "pydantic-settings", marker = "extra == 'dev-strands-nooa'", specifier = ">=2.0.0" }, { name = "pyrefly", marker = "extra == 'dev'", specifier = ">=0.18.0" }, { name = "pyrefly", marker = "extra == 'dev-crewai'", specifier = ">=0.18.0" }, { name = "pyrefly", marker = "extra == 'dev-parlant'", specifier = ">=0.18.0" }, + { name = "pyrefly", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.18.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'dev-crewai'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'dev-parlant'", specifier = ">=7.0.0" }, + { name = "pytest", marker = "extra == 'dev-strands-nooa'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, { name = "pytest-asyncio", marker = "extra == 'dev-crewai'", specifier = ">=0.21.0" }, { name = "pytest-asyncio", marker = "extra == 'dev-parlant'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.21.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, { name = "pytest-cov", marker = "extra == 'dev-crewai'", specifier = ">=4.0.0" }, { name = "pytest-cov", marker = "extra == 'dev-parlant'", specifier = ">=4.0.0" }, + { name = "pytest-cov", marker = "extra == 'dev-strands-nooa'", specifier = ">=4.0.0" }, { name = "pytest-httpx", marker = "extra == 'dev'", specifier = ">=0.35.0" }, { name = "pytest-markdown-docs", marker = "extra == 'dev'", specifier = ">=0.9.2" }, + { name = "pytest-markdown-docs", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.9.2" }, { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.10.0" }, { name = "pytest-mock", marker = "extra == 'dev-crewai'", specifier = ">=3.10.0" }, { name = "pytest-mock", marker = "extra == 'dev-parlant'", specifier = ">=3.10.0" }, + { name = "pytest-mock", marker = "extra == 'dev-strands-nooa'", specifier = ">=3.10.0" }, { name = "pytest-rerunfailures", marker = "extra == 'dev'", specifier = ">=14.0.0" }, { name = "pytest-rerunfailures", marker = "extra == 'dev-crewai'", specifier = ">=14.0.0" }, { name = "pytest-rerunfailures", marker = "extra == 'dev-parlant'", specifier = ">=14.0.0" }, + { name = "pytest-rerunfailures", marker = "extra == 'dev-strands-nooa'", specifier = ">=14.0.0" }, { name = "pytest-timeout", marker = "extra == 'dev'", specifier = ">=2.4.0" }, { name = "pytest-timeout", marker = "extra == 'dev-crewai'", specifier = ">=2.4.0" }, { name = "pytest-timeout", marker = "extra == 'dev-parlant'", specifier = ">=2.4.0" }, + { name = "pytest-timeout", marker = "extra == 'dev-strands-nooa'", specifier = ">=2.4.0" }, { name = "python-dotenv", specifier = ">=1.2.2" }, { name = "python-dotenv", marker = "extra == 'bridge'", specifier = ">=1.2.2" }, { name = "python-dotenv", marker = "extra == 'bridge-agentcore'", specifier = ">=1.2.2" }, @@ -980,11 +1137,13 @@ requires-dist = [ { name = "rich", marker = "extra == 'dev'", specifier = ">=13.0.0" }, { name = "rich", marker = "extra == 'dev-crewai'", specifier = ">=13.0.0" }, { name = "rich", marker = "extra == 'dev-parlant'", specifier = ">=13.0.0" }, + { name = "rich", marker = "extra == 'dev-strands-nooa'", specifier = ">=13.0.0" }, { name = "rich", marker = "extra == 'logging'", specifier = ">=14.0.0" }, { name = "ruamel-yaml", specifier = ">=0.18" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.8.0" }, { name = "ruff", marker = "extra == 'dev-crewai'", specifier = ">=0.8.0" }, { name = "ruff", marker = "extra == 'dev-parlant'", specifier = ">=0.8.0" }, + { name = "ruff", marker = "extra == 'dev-strands-nooa'", specifier = ">=0.8.0" }, { name = "slack-sdk", marker = "extra == 'dev'", specifier = ">=3.27.0" }, { name = "slack-sdk", marker = "extra == 'slack'", specifier = ">=3.27.0" }, { name = "starlette", marker = "extra == 'a2a-gateway'", specifier = ">=0.40.0" }, @@ -992,11 +1151,12 @@ requires-dist = [ { name = "starlette", marker = "extra == 'acp'", specifier = ">=0.40.0" }, { name = "starlette", marker = "extra == 'dev'", specifier = ">=0.40.0" }, { name = "starlette", marker = "extra == 'slack'", specifier = ">=0.40.0" }, - { name = "strands-agents", extras = ["openai"], marker = "extra == 'dev'", specifier = ">=1.50.1,<2" }, + { name = "strands-agents", extras = ["openai"], marker = "extra == 'dev-strands-nooa'", specifier = ">=1.50.1,<2" }, { name = "strands-agents", extras = ["openai"], marker = "extra == 'strands'", specifier = ">=1.50.1,<2" }, { name = "tenacity", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "tenacity", marker = "extra == 'dev-crewai'", specifier = ">=8.0.0" }, { name = "tenacity", marker = "extra == 'dev-parlant'", specifier = ">=8.0.0" }, + { name = "tenacity", marker = "extra == 'dev-strands-nooa'", specifier = ">=8.0.0" }, { name = "uvicorn", marker = "extra == 'a2a-gateway'", specifier = ">=0.29" }, { name = "uvicorn", marker = "extra == 'a2a-gateway-demo'", specifier = ">=0.29" }, { name = "uvicorn", marker = "extra == 'acp'", specifier = ">=0.29" }, @@ -1007,7 +1167,7 @@ requires-dist = [ { name = "werkzeug", marker = "extra == 'dev-parlant'", specifier = ">=3.1.6" }, { name = "werkzeug", marker = "extra == 'parlant'", specifier = ">=3.1.6" }, ] -provides-extras = ["logging", "desktop", "codex", "opencode", "letta", "pydantic-ai", "anthropic", "langgraph", "claude-sdk", "copilot-sdk", "parlant", "crewai", "gemini", "a2a", "a2a-gateway", "a2a-gateway-demo", "acp", "slack", "bridge", "bridge-agentcore", "agentcore-runtime", "google-adk", "agno", "strands", "nooa", "dev", "dev-crewai", "dev-parlant"] +provides-extras = ["logging", "desktop", "codex", "opencode", "letta", "pydantic-ai", "anthropic", "langgraph", "claude-sdk", "copilot-sdk", "parlant", "crewai", "gemini", "a2a", "a2a-gateway", "a2a-gateway-demo", "acp", "slack", "bridge", "bridge-agentcore", "agentcore-runtime", "google-adk", "agno", "strands", "nooa", "dev", "dev-crewai", "dev-parlant", "dev-strands-nooa"] [[package]] name = "band-sdk-core" @@ -1029,10 +1189,10 @@ name = "band-testing-python" version = "0.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pytest-asyncio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/53/2b/47b6a5afca2f6c41f5c75557164654512af96b2a06f09fe50fac35e86d1d/band_testing_python-0.1.4.tar.gz", hash = "sha256:3a4e3bd3b8a37bda5d587a6290cc7d1a8c4b4ecbe7bb348716d632de314d87f7", size = 61988, upload-time = "2026-04-28T13:24:46.244Z" } wheels = [ @@ -1237,7 +1397,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "pycparser", marker = "implementation_name != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -1468,7 +1628,7 @@ dependencies = [ { name = "tqdm" }, { name = "typer" }, { name = "typing-extensions" }, - { name = "uvicorn", extra = ["standard"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "uvicorn", extra = ["standard"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/92/d1/5e33b26985f0c7046a0be1cee2158ada1748ee700d2545057fde1468d74d/chromadb-1.5.9.tar.gz", hash = "sha256:5c20e62a455c28bacac927f26116a73fd8e1799e0d908be8e8a4f02197a54731", size = 2595635, upload-time = "2026-05-05T05:54:51.713Z" } wheels = [ @@ -1486,7 +1646,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "jsonschema" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "sniffio" }, ] @@ -1531,7 +1691,7 @@ name = "coloredlogs" version = "15.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "humanfriendly" }, + { name = "humanfriendly", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } wheels = [ @@ -1566,7 +1726,7 @@ name = "contextvars" version = "2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "immutables" }, + { name = "immutables", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/83/96/55b82d9f13763be9d672622e1b8106c85acb83edd7cc2fa5bc67cd9877e9/contextvars-2.4.tar.gz", hash = "sha256:f38c908aaa59c14335eeea12abea5f443646216c4e29380d7bf34d2018e2c39e", size = 9570, upload-time = "2019-04-01T14:42:11.953Z" } @@ -1575,7 +1735,7 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ @@ -1753,8 +1913,8 @@ wheels = [ [package.optional-dependencies] toml = [ - { name = "tomli", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version <= '3.11' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version > '3.11' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version > '3.11' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version > '3.11' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version <= '3.11' and extra == 'extra-8-band-sdk-dev') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "tomli", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version <= '3.11' and extra == 'extra-8-band-sdk-crewai') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tomli", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version <= '3.11' and extra == 'extra-8-band-sdk-dev') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-nooa') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (python_full_version <= '3.11' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -1778,7 +1938,7 @@ dependencies = [ { name = "lancedb" }, { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" } }, { name = "oauthlib" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, { name = "openpyxl" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-otlp-proto-http" }, @@ -1855,7 +2015,7 @@ name = "croniter" version = "6.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "python-dateutil" }, + { name = "python-dateutil", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/de/5832661ed55107b8a09af3f0a2e71e0957226a59eb1dcf0a445cce6daf20/croniter-6.2.2.tar.gz", hash = "sha256:ba60832a5ec8e12e51b8691c3309a113d1cf6526bdf1a48150ce8ec7a532d0ab", size = 113762, upload-time = "2026-03-15T08:43:48.112Z" } wheels = [ @@ -1867,7 +2027,7 @@ name = "cryptography" version = "50.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "cffi", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz", hash = "sha256:7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", size = 880623, upload-time = "2026-09-30T15:30:04.884Z" } wheels = [ @@ -1936,8 +2096,8 @@ name = "culsans" version = "0.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiologic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "aiologic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/e3/49afa1bc180e0d28008ec6bcdf82a4072d1c7a41032b5b759b60814ca4b0/culsans-0.11.0.tar.gz", hash = "sha256:0b43d0d05dce6106293d114c86e3fb4bfc63088cfe8ff08ed3fe36891447fe33", size = 107546, upload-time = "2025-12-31T23:15:38.196Z" } wheels = [ @@ -1958,10 +2118,10 @@ name = "cyclopts" version = "4.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "attrs" }, - { name = "docstring-parser" }, - { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "rich-rst" }, + { name = "attrs", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "docstring-parser", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich-rst", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/2c/fced34890f6e5a93a4b7afb2c71e8eee2a0719fb26193a0abf159ecb714d/cyclopts-4.10.2.tar.gz", hash = "sha256:d7b950457ef2563596d56331f80cbbbf86a2772535fb8b315c4f03bc7e6127f1", size = 166664, upload-time = "2026-04-08T23:57:45.805Z" } wheels = [ @@ -1982,7 +2142,7 @@ name = "deprecated" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "wrapt" }, + { name = "wrapt", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } wheels = [ @@ -2060,8 +2220,8 @@ name = "email-validator" version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "dnspython" }, - { name = "idna" }, + { name = "dnspython", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "idna", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } wheels = [ @@ -2082,7 +2242,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "(python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.13' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.13' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -2111,27 +2271,27 @@ name = "fastmcp" version = "3.2.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "authlib" }, - { name = "cyclopts" }, - { name = "exceptiongroup" }, - { name = "httpx" }, - { name = "jsonref" }, - { name = "jsonschema-path" }, - { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" } }, - { name = "openapi-pydantic" }, - { name = "opentelemetry-api" }, - { name = "packaging" }, - { name = "platformdirs" }, - { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", extra = ["email"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pyperclip" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, - { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "uncalled-for" }, - { name = "uvicorn" }, - { name = "watchfiles" }, - { name = "websockets" }, + { name = "authlib", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "cyclopts", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "exceptiongroup", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonref", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonschema-path", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openapi-pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-api", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "platformdirs", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", extra = ["email"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyperclip", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-dotenv", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyyaml", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "uncalled-for", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "uvicorn", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "watchfiles", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "websockets", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/42/7eed0a38e3b7a386805fecacf8a5a9353a2b3040395ef9e30e585d8549ac/fastmcp-3.2.3.tar.gz", hash = "sha256:4f02ae8b00227285a0cf6544dea1db29b022c8cdd8d3dfdec7118540210ae60a", size = 26328743, upload-time = "2026-04-09T22:05:03.402Z" } wheels = [ @@ -2197,9 +2357,7 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/0f/59/e19834834cb01a32febfbb0f8a23a9088088f5d45991824ff2bc3b5e8acb/filelock-3.32.7.tar.gz", hash = "sha256:37b8a3d9811b0f9aef7e5ec5c71bb320de52df51e6ca9bcd6f5ad81187660da7", size = 225154, upload-time = "2026-09-16T00:24:20.907Z" } @@ -2212,8 +2370,46 @@ name = "filelock" version = "4.0.9" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", ] sdist = { url = "https://files.pythonhosted.org/packages/70/51/2bc9e529f154fad99b6cd0073e609291eb32fd23581b32362d33d164d316/filelock-4.0.9.tar.gz", hash = "sha256:635e7d67fa92654eed444e75e9ca18426d34e77ad9c469bf4373f75a932f7b22", size = 251200, upload-time = "2026-10-01T23:09:14.029Z" } wheels = [ @@ -2428,15 +2624,15 @@ dependencies = [ { name = "click" }, { name = "fastapi" }, { name = "google-api-python-client" }, - { name = "google-cloud-aiplatform", version = "1.148.1", source = { registry = "https://pypi.org/simple" }, extra = ["agent-engines"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-aiplatform", version = "1.165.1", source = { registry = "https://pypi.org/simple" }, extra = ["agent-engines"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-cloud-aiplatform", version = "1.148.1", source = { registry = "https://pypi.org/simple" }, extra = ["agent-engines"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-aiplatform", version = "1.165.1", source = { registry = "https://pypi.org/simple" }, extra = ["agent-engines"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "google-cloud-secret-manager" }, { name = "google-cloud-speech" }, { name = "google-cloud-storage" }, - { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "graphviz" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "opentelemetry-api" }, { name = "opentelemetry-exporter-gcp-trace" }, @@ -2540,18 +2736,18 @@ resolution-markers = [ "python_full_version == '3.13.*' and sys_platform != 'win32'", ] dependencies = [ - { name = "docstring-parser", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-api-core", extra = ["grpc"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-auth", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-bigquery", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-resource-manager", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-storage", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "proto-plus", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "protobuf", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "docstring-parser", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-api-core", extra = ["grpc"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-auth", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-bigquery", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-resource-manager", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-storage", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "1.75.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "proto-plus", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "protobuf", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c9/f3/b2a9417014c93858a2e3266134f931eefd972c2d410b25d7b8782fc6f143/google_cloud_aiplatform-1.148.1.tar.gz", hash = "sha256:75d605fba34e68714bd08e1e482755d0a6e3ae972805f809d088e686c30879e7", size = 10278758, upload-time = "2026-04-17T23:45:26.738Z" } wheels = [ @@ -2560,18 +2756,18 @@ wheels = [ [package.optional-dependencies] agent-engines = [ - { name = "aiohttp", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "cloudpickle", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-iam", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-logging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-trace", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-exporter-gcp-logging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-exporter-gcp-trace", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "aiohttp", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "cloudpickle", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-iam", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-logging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-trace", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-gcp-logging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-gcp-trace", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-sdk", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -2579,25 +2775,51 @@ name = "google-cloud-aiplatform" version = "1.165.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", -] -dependencies = [ - { name = "certifi", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "docstring-parser", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-api-core", extra = ["grpc"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-auth", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-bigquery", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-resource-manager", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-storage", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "proto-plus", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "protobuf", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "docstring-parser", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-api-core", extra = ["grpc"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-auth", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-bigquery", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-resource-manager", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-storage", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-genai", version = "2.25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "proto-plus", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "protobuf", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/19/45df8264bf80dcc133c777822390c503aa75b878a57e9286d6f520b08c87/google_cloud_aiplatform-1.165.1.tar.gz", hash = "sha256:bd62ba7590255cacd66f9d0439eb731060af460d35bb48dbbeeefce9dfc0a359", size = 11325730, upload-time = "2026-08-19T21:12:30.858Z" } wheels = [ @@ -2606,15 +2828,15 @@ wheels = [ [package.optional-dependencies] agent-engines = [ - { name = "aiohttp", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "cloudpickle", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-cloud-logging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-exporter-gcp-logging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-sdk", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "aiohttp", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "cloudpickle", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-cloud-logging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-gcp-logging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-sdk", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -2682,12 +2904,12 @@ name = "google-cloud-iam" version = "2.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "google-api-core", extra = ["grpc"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-auth", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "grpc-google-iam-v1", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "grpcio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "proto-plus", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "protobuf", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "google-api-core", extra = ["grpc"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-auth", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "grpc-google-iam-v1", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "grpcio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "proto-plus", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "protobuf", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/08/4f88586e9e1cc65754200fc60adf25c2ca7b7da0407a6dcf13362e69e63a/google_cloud_iam-2.26.0.tar.gz", hash = "sha256:d44a86e5cb0bbc904c459b1367bd0124eef802fe0af72ac378f87f7f8e5b2d42", size = 613465, upload-time = "2026-10-01T18:16:49.524Z" } wheels = [ @@ -2839,16 +3061,16 @@ resolution-markers = [ "python_full_version == '3.13.*' and sys_platform != 'win32'", ] dependencies = [ - { name = "anyio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "distro", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-auth", extra = ["requests"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "requests", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "sniffio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tenacity", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "websockets", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "anyio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "distro", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-auth", extra = ["requests"], marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "requests", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "sniffio", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tenacity", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "websockets", marker = "python_full_version >= '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9d/59/3ed61240ef20b3ae6ed54e82c6f8b6d1f194947bc6679679dd6cdb037594/google_genai-1.75.0.tar.gz", hash = "sha256:56bac3991b311c93f980c0a2abcd287b672146905df1fbd71c92ed633d5a07cf", size = 539039, upload-time = "2026-05-04T22:48:54.857Z" } wheels = [ @@ -2860,22 +3082,48 @@ name = "google-genai" version = "2.25.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", -] -dependencies = [ - { name = "anyio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "distro", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "google-auth", extra = ["requests"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "requests", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "sniffio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tenacity", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "websockets", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", +] +dependencies = [ + { name = "anyio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "distro", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "google-auth", extra = ["requests"], marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "requests", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "sniffio", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tenacity", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "websockets", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/62/0a/a3b7856ca840031d4393dbdd97b67fe811b20061315ed68b67b5c85ca80d/google_genai-2.25.0.tar.gz", hash = "sha256:ab603baa5eee0205926ad0f8d7f93e0400df6d67650e99c33e01ab228ea16ad6", size = 699564, upload-time = "2026-09-22T17:23:01.238Z" } wheels = [ @@ -3034,7 +3282,7 @@ name = "griffe" version = "1.15.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama" }, + { name = "colorama", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" } wheels = [ @@ -3207,15 +3455,15 @@ wheels = [ [[package]] name = "httpcore2" -version = "2.9.1" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "h11" }, - { name = "truststore" }, + { name = "h11", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten' or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "truststore", marker = "python_full_version != '3.12.*' or sys_platform != 'emscripten' or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/a8/20ed1ed79cbc2ecdf5301c0968ab7c85547212e2a7bd126ddd2d986e206e/httpcore2-2.9.1.tar.gz", hash = "sha256:4d8acbf8b306f48c9d6046591fd5ba4037d1b1b1000d140fc2c3eab1e9a0c0e2", size = 67089, upload-time = "2026-07-24T09:21:03.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/f3/1db7aa2bc2524062192bb0e0323969492d1883152a232fe36eea65f4e35c/httpcore2-2.13.1.tar.gz", hash = "sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103", size = 68071, upload-time = "2026-09-23T07:47:22.372Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/fb/46c52b781975c335a2bcf1072c7bbc007cbdc8d674217f5ee1daba2c848b/httpcore2-2.9.1-py3-none-any.whl", hash = "sha256:6182472379e855fe4221246a2bb7ecede403bc61c6798062ae1787d051ccde26", size = 82809, upload-time = "2026-07-24T09:21:01.178Z" }, + { url = "https://files.pythonhosted.org/packages/09/ba/a4568248771ce81957bfb7cc600264a40fbcda092391ee1c415c50be4bea/httpcore2-2.13.1-py3-none-any.whl", hash = "sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a", size = 83423, upload-time = "2026-09-23T07:47:19.365Z" }, ] [[package]] @@ -3304,18 +3552,28 @@ wheels = [ [[package]] name = "httpx2" -version = "2.9.1" +version = "2.13.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, - { name = "httpcore2" }, + { name = "anyio", marker = "sys_platform != 'emscripten' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpcore2", marker = "sys_platform != 'emscripten' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx2-jsfetch", marker = "(python_full_version >= '3.12' and sys_platform == 'emscripten') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "idna" }, - { name = "truststore" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "truststore", marker = "sys_platform != 'emscripten' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/44/474bef2a0e9d90f1715d32cb98b0738695ca17ba324095fb2497ed7fbd59/httpx2-2.13.1.tar.gz", hash = "sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa", size = 100405, upload-time = "2026-09-23T07:47:23.052Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/9c/6fe8931fd9f381042a9e4c7d5a7b4cbf7016b252bec0c99a49fce42c3326/httpx2-2.13.1-py3-none-any.whl", hash = "sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4", size = 95597, upload-time = "2026-09-23T07:47:20.995Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/14/38128fbafd7e0ed41d874df6c9a653d47c2d111cfe59e2b4ac95161b4abd/httpx2-2.9.1.tar.gz", hash = "sha256:1932a768737e3666291582833da748cc4e563c337cf96706fccc04fa6e58764a", size = 95458, upload-time = "2026-07-24T09:21:04.972Z" } + +[[package]] +name = "httpx2-jsfetch" +version = "1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/b8/cfd91c4ab9134d386d48f0b6ac662ff3d4be6efdee59ee1c67ebc3c0487c/httpx2-2.9.1-py3-none-any.whl", hash = "sha256:1820fe14a9ab1107bfeff39259987429450b070ec0ff38cc87eb0d8c97fdc71a", size = 91191, upload-time = "2026-07-24T09:21:02.6Z" }, + { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" }, ] [[package]] @@ -3323,16 +3581,16 @@ name = "huggingface-hub" version = "1.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.12' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant')" }, - { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "fsspec", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "hf-xet", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform != 'win32') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform != 'win32') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform != 'win32') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'arm64' and sys_platform != 'win32') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform != 'win32') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pyyaml", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tqdm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typer", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.14' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "fsspec", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "hf-xet", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'arm64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'arm64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'AMD64' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'amd64' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'arm64' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'x86_64' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'amd64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'arm64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine != 'AMD64' and platform_machine != 'aarch64' and platform_machine != 'amd64' and platform_machine != 'arm64' and platform_machine != 'x86_64' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'AMD64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'aarch64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'amd64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'arm64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'x86_64' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'AMD64' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'aarch64' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'amd64' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'amd64' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'arm64' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'arm64' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-crewai') or (platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-crewai') or (platform_machine == 'x86_64' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_machine == 'AMD64' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'aarch64' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'amd64' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'arm64' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (platform_machine == 'x86_64' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyyaml", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tqdm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typer", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dc/89/e7aa12d8a6b9259bed10671abb25ae6fa437c0f88a86ecbf59617bae7759/huggingface_hub-1.11.0.tar.gz", hash = "sha256:15fb3713c7f9cdff7b808a94fd91664f661ab142796bb48c9cd9493e8d166278", size = 761749, upload-time = "2026-04-16T13:07:39.73Z" } wheels = [ @@ -3344,7 +3602,7 @@ name = "humanfriendly" version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyreadline3", marker = "sys_platform == 'win32'" }, + { name = "pyreadline3", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } wheels = [ @@ -3415,7 +3673,7 @@ name = "importlib-metadata" version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "zipp", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "zipp", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version == '3.12.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version == '3.13.*' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.14' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ @@ -3449,7 +3707,7 @@ dependencies = [ { name = "docstring-parser" }, { name = "jinja2" }, { name = "jiter", version = "0.13.0", source = { registry = "https://pypi.org/simple" } }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, { name = "pydantic" }, { name = "pydantic-core" }, { name = "requests" }, @@ -3467,7 +3725,7 @@ name = "jaraco-classes" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "more-itertools" }, + { name = "more-itertools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } wheels = [ @@ -3479,7 +3737,7 @@ name = "jaraco-context" version = "6.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, + { name = "backports-tarfile", marker = "(python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ @@ -3491,7 +3749,7 @@ name = "jaraco-functools" version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "more-itertools" }, + { name = "more-itertools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } wheels = [ @@ -3512,7 +3770,7 @@ name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "markupsafe", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ @@ -3526,11 +3784,10 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/0d/5e/4ec91646aee381d01cdb9974e30882c9cd3b8c5d1079d6b5ff4af522439a/jiter-0.13.0.tar.gz", hash = "sha256:f2839f9c2c7e2dffc1bc5929a510e14ce0a946be9365fd1219e7ef342dae14f4", size = 164847, upload-time = "2026-02-02T12:37:56.441Z" } @@ -3616,102 +3873,166 @@ wheels = [ [[package]] name = "jiter" -version = "0.14.0" +version = "0.17.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", -] -sdist = { url = "https://files.pythonhosted.org/packages/6e/c1/0cddc6eb17d4c53a99840953f95dd3accdc5cfc7a337b0e9b26476276be9/jiter-0.14.0.tar.gz", hash = "sha256:e8a39e66dac7153cf3f964a12aad515afa8d74938ec5cc0018adcdae5367c79e", size = 165725, upload-time = "2026-04-10T14:28:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/1f/198ae537fccb7080a0ed655eb56abf64a92f79489dfbf79f40fa34225bcd/jiter-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7e791e247b8044512e070bd1f3633dc08350d32776d2d6e7473309d0edf256a2", size = 316896, upload-time = "2026-04-10T14:26:01.986Z" }, - { url = "https://files.pythonhosted.org/packages/cf/34/da67cff3fce964a36d03c3e365fb0f8726ade2a6cfd4d3c70107e216ead6/jiter-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71527ce13fd5a0c4e40ad37331f8c547177dbb2dd0a93e5278b6a5eecf748804", size = 321085, upload-time = "2026-04-10T14:26:03.364Z" }, - { url = "https://files.pythonhosted.org/packages/ed/36/4c72e67180d4e71a4f5dcf7886d0840e83c49ab11788172177a77570326e/jiter-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c4a7ab56f746014874f2c525584c0daca1dec37f66fd707ecef3b7e5c2228c", size = 347393, upload-time = "2026-04-10T14:26:05.314Z" }, - { url = "https://files.pythonhosted.org/packages/bc/db/9b39e09ceafa9878235c0fc29e3e3f9b12a4c6a98ea3085b998cadf3accc/jiter-0.14.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:376e9dafff914253bb9d46cdc5f7965607fbe7feb0a491c34e35f92b2770702e", size = 372937, upload-time = "2026-04-10T14:26:06.884Z" }, - { url = "https://files.pythonhosted.org/packages/b0/96/0dcba1d7a82c1b720774b48ef239376addbaf30df24c34742ac4a57b67b2/jiter-0.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23ad2a7a9da1935575c820428dd8d2490ce4d23189691ce33da1fc0a58e14e1c", size = 463646, upload-time = "2026-04-10T14:26:08.345Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e3/f61b71543e746e6b8b805e7755814fc242715c16f1dba58e1cbccb8032c2/jiter-0.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:54b3ddf5786bc7732d293bba3411ac637ecfa200a39983166d1df86a59a43c9f", size = 380225, upload-time = "2026-04-10T14:26:10.161Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5e/0ddeb7096aca099114abe36c4921016e8d251e6f35f5890240b31f1f60ae/jiter-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c001d5a646c2a50dc055dd526dad5d5245969e8234d2b1131d0451e81f3a373", size = 358682, upload-time = "2026-04-10T14:26:11.574Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d1/fe0c46cd7fda9cad8f1ff9ad217dc61f1e4280b21052ec6dfe88c1446ef2/jiter-0.14.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:834bb5bdabca2e91592a03d373838a8d0a1b8bbde7077ae6913fd2fc51812d00", size = 359973, upload-time = "2026-04-10T14:26:13.316Z" }, - { url = "https://files.pythonhosted.org/packages/ac/21/f5317f91729b501019184771c80d60abd89907009e7bfa6c7e348c5bdd44/jiter-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4e9178be60e229b1b2b0710f61b9e24d1f4f8556985a83ff4c4f95920eea7314", size = 397568, upload-time = "2026-04-10T14:26:15.212Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/79d8f33fb2bf168db0df5c9cd16fe440a8ada57e929d3677b22712c2568f/jiter-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7e4ccff04ec03614e62c613e976a3a5860dc9714ce8266f44328bdc8b1cab2c", size = 522535, upload-time = "2026-04-10T14:26:16.956Z" }, - { url = "https://files.pythonhosted.org/packages/5c/00/d1e3ff3d2a465e67f08507d74bafb2dcd29eba91dc939820e39e8dea38b8/jiter-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:69539d936fb5d55caf6ecd33e2e884de083ff0ea28579780d56c4403094bb8d9", size = 556709, upload-time = "2026-04-10T14:26:18.5Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/bbb2189f62ace8d95e869aa4c84c9946616f301e2d02895a6f20dcc3bba3/jiter-0.14.0-cp311-cp311-win32.whl", hash = "sha256:4927d09b3e572787cc5e0a5318601448e1ab9391bcef95677f5840c2d00eaa6d", size = 208660, upload-time = "2026-04-10T14:26:20.511Z" }, - { url = "https://files.pythonhosted.org/packages/b8/86/c500b53dcbf08575f5963e536ebd757a1f7c568272ba5d180b212c9a87fb/jiter-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:42d6ed359ac49eb922fdd565f209c57340aa06d589c84c8413e42a0f9ae1b842", size = 204659, upload-time = "2026-04-10T14:26:22.152Z" }, - { url = "https://files.pythonhosted.org/packages/75/4a/a676249049d42cb29bef82233e4fe0524d414cbe3606c7a4b311193c2f77/jiter-0.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:6dd689f5f4a5a33747b28686e051095beb214fe28cfda5e9fe58a295a788f593", size = 194772, upload-time = "2026-04-10T14:26:23.458Z" }, - { url = "https://files.pythonhosted.org/packages/5a/68/7390a418f10897da93b158f2d5a8bd0bcd73a0f9ec3bb36917085bb759ef/jiter-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2fb2ce3a7bc331256dfb14cefc34832366bb28a9aca81deaf43bbf2a5659e607", size = 316295, upload-time = "2026-04-10T14:26:24.887Z" }, - { url = "https://files.pythonhosted.org/packages/60/a0/5854ac00ff63551c52c6c89534ec6aba4b93474e7924d64e860b1c94165b/jiter-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5252a7ca23785cef5d02d4ece6077a1b556a410c591b379f82091c3001e14844", size = 315898, upload-time = "2026-04-10T14:26:26.601Z" }, - { url = "https://files.pythonhosted.org/packages/41/a1/4f44832650a16b18e8391f1bf1d6ca4909bc738351826bcc198bba4357f4/jiter-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c409578cbd77c338975670ada777add4efd53379667edf0aceea730cabede6fb", size = 343730, upload-time = "2026-04-10T14:26:28.326Z" }, - { url = "https://files.pythonhosted.org/packages/48/64/a329e9d469f86307203594b1707e11ae51c3348d03bfd514a5f997870012/jiter-0.14.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7ede4331a1899d604463369c730dbb961ffdc5312bc7f16c41c2896415b1304a", size = 370102, upload-time = "2026-04-10T14:26:30.089Z" }, - { url = "https://files.pythonhosted.org/packages/94/c1/5e3dfc59635aa4d4c7bd20a820ac1d09b8ed851568356802cf1c08edb3cf/jiter-0.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92cd8b6025981a041f5310430310b55b25ca593972c16407af8837d3d7d2ca01", size = 461335, upload-time = "2026-04-10T14:26:31.911Z" }, - { url = "https://files.pythonhosted.org/packages/e3/1b/dd157009dbc058f7b00108f545ccb72a2d56461395c4fc7b9cfdccb00af4/jiter-0.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:351bf6eda4e3a7ceb876377840c702e9a3e4ecc4624dbfb2d6463c67ae52637d", size = 378536, upload-time = "2026-04-10T14:26:33.595Z" }, - { url = "https://files.pythonhosted.org/packages/91/78/256013667b7c10b8834f8e6e54cd3e562d4c6e34227a1596addccc05e38c/jiter-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1dcfbeb93d9ecd9ca128bbf8910120367777973fa193fb9a39c31237d8df165", size = 353859, upload-time = "2026-04-10T14:26:35.098Z" }, - { url = "https://files.pythonhosted.org/packages/de/d9/137d65ade9093a409fe80955ce60b12bb753722c986467aeda47faf450ad/jiter-0.14.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ae039aaef8de3f8157ecc1fdd4d85043ac4f57538c245a0afaecb8321ec951c3", size = 357626, upload-time = "2026-04-10T14:26:36.685Z" }, - { url = "https://files.pythonhosted.org/packages/2e/48/76750835b87029342727c1a268bea8878ab988caf81ee4e7b880900eeb5a/jiter-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d9d51eb96c82a9652933bd769fe6de66877d6eb2b2440e281f2938c51b5643e", size = 393172, upload-time = "2026-04-10T14:26:38.097Z" }, - { url = "https://files.pythonhosted.org/packages/a6/60/456c4e81d5c8045279aefe60e9e483be08793828800a4e64add8fdde7f2a/jiter-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d824ca4148b705970bf4e120924a212fdfca9859a73e42bd7889a63a4ea6bb98", size = 520300, upload-time = "2026-04-10T14:26:39.532Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/2020e0984c235f678dced38fe4eec3058cf528e6af36ebf969b410305941/jiter-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff3a6465b3a0f54b1a430f45c3c0ba7d61ceb45cbc3e33f9e1a7f638d690baf3", size = 553059, upload-time = "2026-04-10T14:26:40.991Z" }, - { url = "https://files.pythonhosted.org/packages/ef/32/e2d298e1a22a4bbe6062136d1c7192db7dba003a6975e51d9a9eecabc4c2/jiter-0.14.0-cp312-cp312-win32.whl", hash = "sha256:5dec7c0a3e98d2a3f8a2e67382d0d7c3ac60c69103a4b271da889b4e8bb1e129", size = 206030, upload-time = "2026-04-10T14:26:42.517Z" }, - { url = "https://files.pythonhosted.org/packages/36/ac/96369141b3d8a4a8e4590e983085efe1c436f35c0cda940dd76d942e3e40/jiter-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:fc7e37b4b8bc7e80a63ad6cfa5fc11fab27dbfea4cc4ae644b1ab3f273dc348f", size = 201603, upload-time = "2026-04-10T14:26:44.328Z" }, - { url = "https://files.pythonhosted.org/packages/01/c3/75d847f264647017d7e3052bbcc8b1e24b95fa139c320c5f5066fa7a0bdd/jiter-0.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:ee4a72f12847ef29b072aee9ad5474041ab2924106bdca9fcf5d7d965853e057", size = 191525, upload-time = "2026-04-10T14:26:46Z" }, - { url = "https://files.pythonhosted.org/packages/97/2a/09f70020898507a89279659a1afe3364d57fc1b2c89949081975d135f6f5/jiter-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:af72f204cf4d44258e5b4c1745130ac45ddab0e71a06333b01de660ab4187a94", size = 315502, upload-time = "2026-04-10T14:26:47.697Z" }, - { url = "https://files.pythonhosted.org/packages/d6/be/080c96a45cd74f9fce5db4fd68510b88087fb37ffe2541ff73c12db92535/jiter-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4b77da71f6e819be5fbcec11a453fde5b1d0267ef6ed487e2a392fd8e14e4e3a", size = 314870, upload-time = "2026-04-10T14:26:49.149Z" }, - { url = "https://files.pythonhosted.org/packages/7d/5e/2d0fee155826a968a832cc32438de5e2a193292c8721ca70d0b53e58245b/jiter-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f4ea612fe8b84b8b04e51d0e78029ecf3466348e25973f953de6e6a59aa4c1", size = 343406, upload-time = "2026-04-10T14:26:50.762Z" }, - { url = "https://files.pythonhosted.org/packages/70/af/bf9ee0d3a4f8dc0d679fc1337f874fe60cdbf841ebbb304b374e1c9aaceb/jiter-0.14.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:62fe2451f8fcc0240261e6a4df18ecbcd58327857e61e625b2393ea3b468aac9", size = 369415, upload-time = "2026-04-10T14:26:52.188Z" }, - { url = "https://files.pythonhosted.org/packages/0f/83/8e8561eadba31f4d3948a5b712fb0447ec71c3560b57a855449e7b8ddc98/jiter-0.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6112f26f5afc75bcb475787d29da3aa92f9d09c7858f632f4be6ffe607be82e9", size = 461456, upload-time = "2026-04-10T14:26:53.611Z" }, - { url = "https://files.pythonhosted.org/packages/f6/c9/c5299e826a5fe6108d172b344033f61c69b1bb979dd8d9ddd4278a160971/jiter-0.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:215a6cb8fb7dc702aa35d475cc00ddc7f970e5c0b1417fb4b4ac5d82fa2a29db", size = 378488, upload-time = "2026-04-10T14:26:55.211Z" }, - { url = "https://files.pythonhosted.org/packages/5d/37/c16d9d15c0a471b8644b1abe3c82668092a707d9bedcf076f24ff2e380cd/jiter-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4ab96a30fb3cb2c7e0cd33f7616c8860da5f5674438988a54ac717caccdbaa", size = 353242, upload-time = "2026-04-10T14:26:56.705Z" }, - { url = "https://files.pythonhosted.org/packages/58/ea/8050cb0dc654e728e1bfacbc0c640772f2181af5dedd13ae70145743a439/jiter-0.14.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:3a99c1387b1f2928f799a9de899193484d66206a50e98233b6b088a7f0c1edb2", size = 356823, upload-time = "2026-04-10T14:26:58.281Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/cf71506d270e5f84d97326bf220e47aed9b95e9a4a060758fb07772170ab/jiter-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ab18d11074485438695f8d34a1b6da61db9754248f96d51341956607a8f39985", size = 392564, upload-time = "2026-04-10T14:27:00.018Z" }, - { url = "https://files.pythonhosted.org/packages/b0/cc/8c6c74a3efb5bd671bfd14f51e8a73375464ca914b1551bc3b40e26ac2c9/jiter-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:801028dcfc26ac0895e4964cbc0fd62c73be9fd4a7d7b1aaf6e5790033a719b7", size = 520322, upload-time = "2026-04-10T14:27:01.664Z" }, - { url = "https://files.pythonhosted.org/packages/41/24/68d7b883ec959884ddf00d019b2e0e82ba81b167e1253684fa90519ce33c/jiter-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ad425b087aafb4a1c7e1e98a279200743b9aaf30c3e0ba723aec93f061bd9bc8", size = 552619, upload-time = "2026-04-10T14:27:03.316Z" }, - { url = "https://files.pythonhosted.org/packages/b6/89/b1a0985223bbf3150ff9e8f46f98fc9360c1de94f48abe271bbe1b465682/jiter-0.14.0-cp313-cp313-win32.whl", hash = "sha256:882bcb9b334318e233950b8be366fe5f92c86b66a7e449e76975dfd6d776a01f", size = 205699, upload-time = "2026-04-10T14:27:04.662Z" }, - { url = "https://files.pythonhosted.org/packages/4c/19/3f339a5a7f14a11730e67f6be34f9d5105751d547b615ef593fa122a5ded/jiter-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:9b8c571a5dba09b98bd3462b5a53f27209a5cbbe85670391692ede71974e979f", size = 201323, upload-time = "2026-04-10T14:27:06.139Z" }, - { url = "https://files.pythonhosted.org/packages/50/56/752dd89c84be0e022a8ea3720bcfa0a8431db79a962578544812ce061739/jiter-0.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:34f19dcc35cb1abe7c369b3756babf8c7f04595c0807a848df8f26ef8298ef92", size = 191099, upload-time = "2026-04-10T14:27:07.564Z" }, - { url = "https://files.pythonhosted.org/packages/91/28/292916f354f25a1fe8cf2c918d1415c699a4a659ae00be0430e1c5d9ffea/jiter-0.14.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e89bcd7d426a75bb4952c696b267075790d854a07aad4c9894551a82c5b574ab", size = 320880, upload-time = "2026-04-10T14:27:09.326Z" }, - { url = "https://files.pythonhosted.org/packages/ad/c7/b002a7d8b8957ac3d469bd59c18ef4b1595a5216ae0de639a287b9816023/jiter-0.14.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b25beaa0d4447ea8c7ae0c18c688905d34840d7d0b937f2f7bdd52162c98a40", size = 346563, upload-time = "2026-04-10T14:27:11.287Z" }, - { url = "https://files.pythonhosted.org/packages/f9/3b/f8d07580d8706021d255a6356b8fab13ee4c869412995550ce6ed4ddf97d/jiter-0.14.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a8758dd413c51e3b7f6557cdc6921faf70b14106f45f969f091f5cda990ea", size = 357928, upload-time = "2026-04-10T14:27:12.729Z" }, - { url = "https://files.pythonhosted.org/packages/47/5b/ac1a974da29e35507230383110ffec59998b290a8732585d04e19a9eb5ba/jiter-0.14.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e1a7eead856a5038a8d291f1447176ab0b525c77a279a058121b5fccee257f6f", size = 203519, upload-time = "2026-04-10T14:27:14.125Z" }, - { url = "https://files.pythonhosted.org/packages/96/6d/9fc8433d667d2454271378a79747d8c76c10b51b482b454e6190e511f244/jiter-0.14.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e692633a12cda97e352fdcd1c4acc971b1c28707e1e33aeef782b0cbf051975", size = 190113, upload-time = "2026-04-10T14:27:16.638Z" }, - { url = "https://files.pythonhosted.org/packages/4f/1e/354ed92461b165bd581f9ef5150971a572c873ec3b68a916d5aa91da3cc2/jiter-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:6f396837fc7577871ca8c12edaf239ed9ccef3bbe39904ae9b8b63ce0a48b140", size = 315277, upload-time = "2026-04-10T14:27:18.109Z" }, - { url = "https://files.pythonhosted.org/packages/a6/95/8c7c7028aa8636ac21b7a55faef3e34215e6ed0cbf5ae58258427f621aa3/jiter-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a4d50ea3d8ba4176f79754333bd35f1bbcd28e91adc13eb9b7ca91bc52a6cef9", size = 315923, upload-time = "2026-04-10T14:27:19.603Z" }, - { url = "https://files.pythonhosted.org/packages/47/40/e2a852a44c4a089f2681a16611b7ce113224a80fd8504c46d78491b47220/jiter-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce17f8a050447d1b4153bda4fb7d26e6a9e74eb4f4a41913f30934c5075bf615", size = 344943, upload-time = "2026-04-10T14:27:21.262Z" }, - { url = "https://files.pythonhosted.org/packages/fc/1f/670f92adee1e9895eac41e8a4d623b6da68c4d46249d8b556b60b63f949e/jiter-0.14.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f4f1c4b125e1652aefbc2e2c1617b60a160ab789d180e3d423c41439e5f32850", size = 369725, upload-time = "2026-04-10T14:27:22.766Z" }, - { url = "https://files.pythonhosted.org/packages/01/2f/541c9ba567d05de1c4874a0f8f8c5e3fd78e2b874266623da9a775cf46e0/jiter-0.14.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be808176a6a3a14321d18c603f2d40741858a7c4fc982f83232842689fe86dd9", size = 461210, upload-time = "2026-04-10T14:27:24.315Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a9/c31cbec09627e0d5de7aeaec7690dba03e090caa808fefd8133137cf45bc/jiter-0.14.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26679d58ba816f88c3849306dd58cb863a90a1cf352cdd4ef67e30ccf8a77994", size = 380002, upload-time = "2026-04-10T14:27:26.155Z" }, - { url = "https://files.pythonhosted.org/packages/50/02/3c05c1666c41904a2f607475a73e7a4763d1cbde2d18229c4f85b22dc253/jiter-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80381f5a19af8fa9aef743f080e34f6b25ebd89656475f8cf0470ec6157052aa", size = 354678, upload-time = "2026-04-10T14:27:27.701Z" }, - { url = "https://files.pythonhosted.org/packages/7d/97/e15b33545c2b13518f560d695f974b9891b311641bdcf178d63177e8801e/jiter-0.14.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:004df5fdb8ecbd6d99f3227df18ba1a259254c4359736a2e6f036c944e02d7c5", size = 358920, upload-time = "2026-04-10T14:27:29.256Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d2/8b1461def6b96ba44530df20d07ef7a1c7da22f3f9bf1727e2d611077bf1/jiter-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cff5708f7ed0fa098f2b53446c6fa74c48469118e5cd7497b4f1cd569ab06928", size = 394512, upload-time = "2026-04-10T14:27:31.344Z" }, - { url = "https://files.pythonhosted.org/packages/e3/88/837566dd6ed6e452e8d3205355afd484ce44b2533edfa4ed73a298ea893e/jiter-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:2492e5f06c36a976d25c7cc347a60e26d5470178d44cde1b9b75e60b4e519f28", size = 521120, upload-time = "2026-04-10T14:27:33.299Z" }, - { url = "https://files.pythonhosted.org/packages/89/6b/b00b45c4d1b4c031777fe161d620b755b5b02cdade1e316dcb46e4471d63/jiter-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:7609cfbe3a03d37bfdbf5052012d5a879e72b83168a363deae7b3a26564d57de", size = 553668, upload-time = "2026-04-10T14:27:34.868Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d8/6fe5b42011d19397433d345716eac16728ac241862a2aac9c91923c7509a/jiter-0.14.0-cp314-cp314-win32.whl", hash = "sha256:7282342d32e357543565286b6450378c3cd402eea333fc1ebe146f1fabb306fc", size = 207001, upload-time = "2026-04-10T14:27:36.455Z" }, - { url = "https://files.pythonhosted.org/packages/e5/43/5c2e08da1efad5e410f0eaaabeadd954812612c33fbbd8fd5328b489139d/jiter-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:bd77945f38866a448e73b0b7637366afa814d4617790ecd88a18ca74377e6c02", size = 202187, upload-time = "2026-04-10T14:27:38Z" }, - { url = "https://files.pythonhosted.org/packages/aa/1f/6e39ac0b4cdfa23e606af5b245df5f9adaa76f35e0c5096790da430ca506/jiter-0.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:f2d4c61da0821ee42e0cdf5489da60a6d074306313a377c2b35af464955a3611", size = 192257, upload-time = "2026-04-10T14:27:39.504Z" }, - { url = "https://files.pythonhosted.org/packages/05/57/7dbc0ffbbb5176a27e3518716608aa464aee2e2887dc938f0b900a120449/jiter-0.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1bf7ff85517dd2f20a5750081d2b75083c1b269cf75afc7511bdf1f9548beb3b", size = 323441, upload-time = "2026-04-10T14:27:41.039Z" }, - { url = "https://files.pythonhosted.org/packages/83/6e/7b3314398d8983f06b557aa21b670511ec72d3b79a68ee5e4d9bff972286/jiter-0.14.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ef8791c3e78d6c6b157c6d360fbb5c715bebb8113bc6a9303c5caff012754a", size = 348109, upload-time = "2026-04-10T14:27:42.552Z" }, - { url = "https://files.pythonhosted.org/packages/ae/4f/8dc674bcd7db6dba566de73c08c763c337058baff1dbeb34567045b27cdc/jiter-0.14.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e74663b8b10da1fe0f4e4703fd7980d24ad17174b6bb35d8498d6e3ebce2ae6a", size = 368328, upload-time = "2026-04-10T14:27:44.574Z" }, - { url = "https://files.pythonhosted.org/packages/3b/5f/188e09a1f20906f98bbdec44ed820e19f4e8eb8aff88b9d1a5a497587ff3/jiter-0.14.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1aca29ba52913f78362ec9c2da62f22cdc4c3083313403f90c15460979b84d9b", size = 463301, upload-time = "2026-04-10T14:27:46.717Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f0/19046ef965ed8f349e8554775bb12ff4352f443fbe12b95d31f575891256/jiter-0.14.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b39b7d87a952b79949af5fef44d2544e58c21a28da7f1bae3ef166455c61746", size = 378891, upload-time = "2026-04-10T14:27:48.32Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c3/da43bd8431ee175695777ee78cf0e93eacbb47393ff493f18c45231b427d/jiter-0.14.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d918a68b26e9fab068c2b5453577ef04943ab2807b9a6275df2a812599a310", size = 360749, upload-time = "2026-04-10T14:27:49.88Z" }, - { url = "https://files.pythonhosted.org/packages/72/26/e054771be889707c6161dbdec9c23d33a9ec70945395d70f07cfea1e9a6f/jiter-0.14.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:b08997c35aee1201c1a5361466a8fb9162d03ae7bf6568df70b6c859f1e654a4", size = 358526, upload-time = "2026-04-10T14:27:51.504Z" }, - { url = "https://files.pythonhosted.org/packages/c3/0f/7bea65ea2a6d91f2bf989ff11a18136644392bf2b0497a1fa50934c30a9c/jiter-0.14.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:260bf7ca20704d58d41f669e5e9fe7fe2fa72901a6b324e79056f5d52e9c9be2", size = 393926, upload-time = "2026-04-10T14:27:53.368Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a1/b1ff7d70deef61ac0b7c6c2f12d2ace950cdeecb4fdc94500a0926802857/jiter-0.14.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:37826e3df29e60f30a382f9294348d0238ef127f4b5d7f5f8da78b5b9e050560", size = 521052, upload-time = "2026-04-10T14:27:55.058Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7b/3b0649983cbaf15eda26a414b5b1982e910c67bd6f7b1b490f3cfc76896a/jiter-0.14.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:645be49c46f2900937ba0eaf871ad5183c96858c0af74b6becc7f4e367e36e06", size = 553716, upload-time = "2026-04-10T14:27:57.269Z" }, - { url = "https://files.pythonhosted.org/packages/97/f8/33d78c83bd93ae0c0af05293a6660f88a1977caef39a6d72a84afab94ce0/jiter-0.14.0-cp314-cp314t-win32.whl", hash = "sha256:2f7877ed45118de283786178eceaf877110abacd04fde31efff3940ae9672674", size = 207957, upload-time = "2026-04-10T14:27:59.285Z" }, - { url = "https://files.pythonhosted.org/packages/d6/ac/2b760516c03e2227826d1f7025d89bf6bf6357a28fe75c2a2800873c50bf/jiter-0.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:14c0cb10337c49f5eafe8e7364daca5e29a020ea03580b8f8e6c597fed4e1588", size = 204690, upload-time = "2026-04-10T14:28:00.962Z" }, - { url = "https://files.pythonhosted.org/packages/dc/2e/a44c20c58aeed0355f2d326969a181696aeb551a25195f47563908a815be/jiter-0.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:5419d4aa2024961da9fe12a9cfe7484996735dca99e8e090b5c88595ef1951ff", size = 191338, upload-time = "2026-04-10T14:28:02.853Z" }, - { url = "https://files.pythonhosted.org/packages/32/a1/ef34ca2cab2962598591636a1804b93645821201cc0095d4a93a9a329c9d/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:a25ffa2dbbdf8721855612f6dca15c108224b12d0c4024d0ac3d7902132b4211", size = 311366, upload-time = "2026-04-10T14:28:27.943Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/520576a532a6b8a6f42747afed289c8448c879a34d7802fe2c832d4fd38f/jiter-0.14.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ac9cbaa86c10996b92bd12c91659b60f939f8e28fcfa6bc11a0e90a774ce95b", size = 309873, upload-time = "2026-04-10T14:28:29.688Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7c/c16db114ea1f2f532f198aa8dc39585026af45af362c69a0492f31bc4821/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:844e73b6c56b505e9e169234ea3bdea2ea43f769f847f47ac559ba1d2361ebea", size = 344816, upload-time = "2026-04-10T14:28:31.348Z" }, - { url = "https://files.pythonhosted.org/packages/99/8f/15e7741ff19e9bcd4d753f7ff22f988fd54592f134ca13701c13ea8c20e0/jiter-0.14.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52c076f187405fc21523c746c04399c9af8ece566077ed147b2126f2bcba577", size = 351445, upload-time = "2026-04-10T14:28:33.093Z" }, - { url = "https://files.pythonhosted.org/packages/21/42/9042c3f3019de4adcb8c16591c325ec7255beea9fcd33a42a43f3b0b1000/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:fbd9e482663ca9d005d051330e4d2d8150bb208a209409c10f7e7dfdf7c49da9", size = 308810, upload-time = "2026-04-10T14:28:34.673Z" }, - { url = "https://files.pythonhosted.org/packages/60/cf/a7e19b308bd86bb04776803b1f01a5f9a287a4c55205f4708827ee487fbf/jiter-0.14.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:33a20d838b91ef376b3a56896d5b04e725c7df5bc4864cc6569cf046a8d73b6d", size = 308443, upload-time = "2026-04-10T14:28:36.658Z" }, - { url = "https://files.pythonhosted.org/packages/ca/44/e26ede3f0caeff93f222559cb0cc4ca68579f07d009d7b6010c5b586f9b1/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:432c4db5255d86a259efde91e55cb4c8d18c0521d844c9e2e7efcce3899fb016", size = 343039, upload-time = "2026-04-10T14:28:38.356Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/1f9ada30cef7b05e74bb06f52127e7a724976c225f46adb65c37b1dadfb6/jiter-0.14.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f00d94b281174144d6532a04b66a12cb866cbdc47c3af3bfe2973677f9861a", size = 349613, upload-time = "2026-04-10T14:28:40.066Z" }, + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/1f/8176d92e001f86505424b41664032ae26a882bc9ca41a32c803f373f9195/jiter-0.17.0.tar.gz", hash = "sha256:03e432f226a453851079fb84cd17c6da9991eab723e28d716f14ae3d906e0c12", size = 229037, upload-time = "2026-09-12T15:14:14.253Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/50/17afdaffcc8af4bf4fddf2b6c26d066553aa2221983f2affcde435fc2532/jiter-0.17.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:cfafd7be8b16ceadd298db542cead37cddc211c4c49e04ad2596924df18625b1", size = 290699, upload-time = "2026-09-12T15:11:30.085Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/c185d32d5b3657ad84da26c84a9eb15f00aa1b39d6882fcc0052dba2d7c2/jiter-0.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8adca2e793288e5f1bb29279bb439d0d3cfbb50eddca7e7e6ffd42ff4f482406", size = 324246, upload-time = "2026-09-12T15:11:31.3Z" }, + { url = "https://files.pythonhosted.org/packages/24/7a/8b8903bfe91a90a8fa1ec9b45d9fda5b6287a386693b69d720a882d73f3c/jiter-0.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30c692d567ba206c7cca38c9d1d0ccc70c9786290173c184d871ca12e9981ed7", size = 343275, upload-time = "2026-09-12T15:11:32.758Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5d/6821fae2abc71a3c3a84bef8598d31fc4f27d9edfb55bd8f6c08afb8ef93/jiter-0.17.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81c83c0abe614446a283d994d2c07c4f58632dea2cdf66ba9e2921bb8ccd593e", size = 328034, upload-time = "2026-09-12T15:11:33.9Z" }, + { url = "https://files.pythonhosted.org/packages/f3/51/8e7a963b1c2dfdc01d6228b004f50a2a3d7c46f0549d7b096a5d15ef81d5/jiter-0.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:073dc68c1a700c8fc480e877864a6b6ffc887533e261f4380c08c16bf09d057a", size = 342457, upload-time = "2026-09-12T15:11:36.414Z" }, + { url = "https://files.pythonhosted.org/packages/73/27/8b2a267e3bda45d9298331cacfe3521e761f0a2b05ad10a23c6548d08358/jiter-0.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:492f37230bbf9581ab2c17bcda862c249afb9ae2e3ab2dd6db59943bc4cc3153", size = 351271, upload-time = "2026-09-12T15:11:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/4a/8f/5c74e5e142a6736833d7a991ab04d5c0738038dc44db05af0bb3cd2559e8/jiter-0.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5888fe5abc1ca2fa834a3e1b4c7ef0dcece286a7d7e95a609ef0934b777b9fc9", size = 346052, upload-time = "2026-09-12T15:11:39.722Z" }, + { url = "https://files.pythonhosted.org/packages/98/9c/f54920f06d1696e80b1be841d56412871c6856b1b1e3b541b1ed35346554/jiter-0.17.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:84ac78df457e1ee3f7e733bd114823302ae8c5ad5542d7e6647d92ffaa090a04", size = 328915, upload-time = "2026-09-12T15:11:41.065Z" }, + { url = "https://files.pythonhosted.org/packages/21/53/080f126863bceb055db9f1fd5431485eb493b35545a3c35e961ac18cd924/jiter-0.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7573e80232c5bcf80c24c038cf7e53a463f5c3b1dd1dd4109d66304f4dccc233", size = 337240, upload-time = "2026-09-12T15:11:42.356Z" }, + { url = "https://files.pythonhosted.org/packages/f0/76/3ab742823a0e0e70e143c6c90a482d9d90396ac2445e7b9483eb7245d3b5/jiter-0.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:11902505d401691720f5785c15b02204248526edee11b635cd6c40cd52b81599", size = 484917, upload-time = "2026-09-12T15:11:43.549Z" }, + { url = "https://files.pythonhosted.org/packages/14/e0/8ca71bc8b9cc9ed96c9da565863e00f3bb875a8fb82abcf03e975e067902/jiter-0.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:64846211a2debe7c071d2146d2283d2b0c1c93dc8fd5fb7794faac2ca6061b5c", size = 521868, upload-time = "2026-09-12T15:11:44.704Z" }, + { url = "https://files.pythonhosted.org/packages/c1/02/81f8719dcedb75713082a2048405376c81f6546b75af8167f3bba01a1ed0/jiter-0.17.0-cp311-cp311-win32.whl", hash = "sha256:c19b9357309b8cc6de8a48fca8e44a8c9c2feaaa2f5896d037fa505d48fcab80", size = 187844, upload-time = "2026-09-12T15:11:45.874Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8c/59693f348488f01ed12d862e99ab8da14961152d3e9c39b9b1ef363f3572/jiter-0.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:e654b6b04e39c9cb19cb8b04c6ddf1f2db07751fa14156413969fd78bad0e5cb", size = 231402, upload-time = "2026-09-12T15:11:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/fe/89/fb35e286463cb9f01edc2c4e47df6e5477ee36bca5096414e9ea87985588/jiter-0.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:3ad556afc289f15d2b181b941982d01f06190863c07440185b9f354e1bd2def3", size = 187006, upload-time = "2026-09-12T15:11:48.245Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f8/07bd8c3a23f7a8a6875e6a820bbffe1483a18f18f9398a91b5495123176e/jiter-0.17.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ebf918dfd6a74adc1b9ad71f63c4ab00902fcd3b7fd39f2e24d871db8d713b91", size = 291633, upload-time = "2026-09-12T15:11:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5e/0de4c6f84ffefa6809ffc2d550b9a314365acf7e7ec9b6c7375d49047900/jiter-0.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61aed66ee042b3b49ef85fdf75714234d055d89d8496ac1c6e47f89e7a30d5e4", size = 321695, upload-time = "2026-09-12T15:11:52.727Z" }, + { url = "https://files.pythonhosted.org/packages/20/ac/befe2e82065bee37a0252081666ed2f48c1ac5f5c6c318c2de8168ba393d/jiter-0.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76eb4a5c20e86f9f848286f167024890f2862258a965d254774deb7fc1545ca1", size = 341967, upload-time = "2026-09-12T15:11:54.231Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cd/9797c1e529746750ae589da7c1a8c24373f00d88e11a989f9e5eb1959079/jiter-0.17.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bcc064f99183a9cbe7f26ed648c352031a74145cd61ed75d34632c73eb46a5a8", size = 326546, upload-time = "2026-09-12T15:11:55.41Z" }, + { url = "https://files.pythonhosted.org/packages/d9/fd/e6914c38d6347bab4ebff2b1f0c0f191db276e7a1d5c376176757da42fe3/jiter-0.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73b64e69c4150748e020356d958af94bec33c70a0a93d665cfa8f6d580fe1a63", size = 340995, upload-time = "2026-09-12T15:11:58.211Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7d/611b3abf6f88945b5474da5cdc6d1a185e805ac9bf446bb7766dcda6ea87/jiter-0.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0bc7f684b65bcda9c20434267577db71bf9905ceddd32b60d1d93278d8c8d3a", size = 352188, upload-time = "2026-09-12T15:11:59.414Z" }, + { url = "https://files.pythonhosted.org/packages/52/f8/b6e513ecbdf3b3cebe587c2279281ecf775b729a58cf4cc7bdf898ded029/jiter-0.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c21265b251d99bbb40080d178a8953e35601d3a1564e05c4de4c0d2ca616797", size = 345025, upload-time = "2026-09-12T15:12:00.697Z" }, + { url = "https://files.pythonhosted.org/packages/28/a8/fe26d06c5a6c5a4cfe703c5154c8a140da1305671eb3681aba9422d4f393/jiter-0.17.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:f3d7f7b34114f7ddc6d72a8e882d49de636b35d9fd12b4d420d3c5729f6c9812", size = 329180, upload-time = "2026-09-12T15:12:01.831Z" }, + { url = "https://files.pythonhosted.org/packages/e1/58/e6d66a26af40a20e62486feb7e222fd50f6e7aaa4f107abd89675dcc835b/jiter-0.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5078ab00664307fab2019b522a93aeb191122789f085daf5fd9e362154021d4a", size = 335805, upload-time = "2026-09-12T15:12:03.056Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3e/96520aa2fef5ef831d95483a902140bfab83dcac9eaa74f7df61b5e50a1b/jiter-0.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:470e1b1e4c42f1ead2189166a299691871a2df5056c976e7fb96feafaf5f9d44", size = 484121, upload-time = "2026-09-12T15:12:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8f/5d9d92fe538bf36ff481a2278c48147e59c1cf8eb2f7be665260665febe5/jiter-0.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6eb6aedeb7352b8f3b6af9cbd67983840165c00428e63f1b420a85885128ea31", size = 521310, upload-time = "2026-09-12T15:12:05.612Z" }, + { url = "https://files.pythonhosted.org/packages/50/06/a09f979b22e652afbc3de66c709b2ba92edcef555f7535ab937c86b4f21a/jiter-0.17.0-cp312-cp312-win32.whl", hash = "sha256:362bb47423886d45a9f705d2d9d4008c6eedd4e41eb1bab4e96fb6daa06b33fd", size = 185029, upload-time = "2026-09-12T15:12:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d9/98265a005b2473ec2be5a84e2b64c2f65382c673879f1574845cd4bcd77c/jiter-0.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:9bd3caac219df476dd0cc3fe01d2f1581ed588906feac767abd9614c1c12f8b3", size = 227381, upload-time = "2026-09-12T15:12:08.823Z" }, + { url = "https://files.pythonhosted.org/packages/a8/11/2e05bf5a56e57a543ebb8f585074adf09383e99d7b062dac92eab1f4d57f/jiter-0.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:36ee6e69027396664e59995b9a635a947a5304ee9837279584a0bb8145c8f6b8", size = 183610, upload-time = "2026-09-12T15:12:10.374Z" }, + { url = "https://files.pythonhosted.org/packages/40/eb/2c4a8075ed5ea02b56911e9375d4c8d7784572ff4af32e5a99ae0d071044/jiter-0.17.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1b18434638228c0c184281609bf3d9459026a0f1ea48fb76c205e3ef72069caa", size = 290991, upload-time = "2026-09-12T15:12:11.641Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b1/34bfa29599d420423baac6ff7cada6674fe63d5a7a2ccb3900b904678783/jiter-0.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec89771f4272b989487a6364e519db6bbaba323e8bbf949ac89a45ea9c18b7a3", size = 321425, upload-time = "2026-09-12T15:12:13.855Z" }, + { url = "https://files.pythonhosted.org/packages/11/71/a5ac64a62a04aebd556afadab14a6b730001e16df87266ded943a100a1d9/jiter-0.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e3f052c671d5f425cca5ea5901cf11a831369fba4a55a3862cab93c323b4c3b", size = 343138, upload-time = "2026-09-12T15:12:15.046Z" }, + { url = "https://files.pythonhosted.org/packages/01/dd/f761e320ea473314cb68612bc6a435393464dbd198051399b36848b4ebf3/jiter-0.17.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785a216bbaf8f15fc974e964ced7322cd3d774bb0e86949edd78c6bffd6ba35b", size = 325805, upload-time = "2026-09-12T15:12:16.506Z" }, + { url = "https://files.pythonhosted.org/packages/19/1a/27d8e40f0fb29bbc7a5adf30907144396a115dbe93d5d8976c054a6dfe96/jiter-0.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d85c558c9f8532bba287a990ac63767c7daf756f0d8c030219f62499b1fa228a", size = 340230, upload-time = "2026-09-12T15:12:17.682Z" }, + { url = "https://files.pythonhosted.org/packages/ac/c0/30bcde78a28155461f965d16b7aca4ffca6d17494d905f7a0bb072e6c64e/jiter-0.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c23849235d2142ce444b2b8c6eceee9f82f4cc0bd5c9081602e4155c6197807", size = 351343, upload-time = "2026-09-12T15:12:19.337Z" }, + { url = "https://files.pythonhosted.org/packages/27/17/91420b156315ae22732f5ee1a7b5725a030aab9dc8fd7dcdacfb4aa588d3/jiter-0.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58df29268a95e910f17db7ec9178eb7f15aa8619aaca3575275c4e6b3f4fe4c5", size = 344990, upload-time = "2026-09-12T15:12:20.705Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a2/ae6d5672644cc11127970277c9aeb0fa6fae376845587f5b0a8e8828167c/jiter-0.17.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:a277f97eba7d66b1ee27eb5dab5b774ff46a10c78d89a1d3dcce04ce1357c8ca", size = 328624, upload-time = "2026-09-12T15:12:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/04/62/45cb1162f6aa586536e4a973fc339d72dc6b08cca030d70a838a307aa778/jiter-0.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe15ddf316f1f1f643347d3a474e74ce61880c79a11ec5dca53df20c071bd3e8", size = 334731, upload-time = "2026-09-12T15:12:25.229Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5f/45c1574b644da7deda0b7591c349520dcf83ce45b24d7ca19922dab1fc27/jiter-0.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:02adebb7ce6413c44d40af9ad59d1c1cd79630ccdcb6f7bdd2d461e48c03d8f9", size = 483649, upload-time = "2026-09-12T15:12:27.557Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d3/ebea1ecb5b241c519f192b30215c79a8e47f42f1621acbcd6f8830728416/jiter-0.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:55d0e0e613a3f9ad600cf436e0e2b8057d1b52bcf1d91b2d36ac53451231e6a8", size = 520758, upload-time = "2026-09-12T15:12:28.99Z" }, + { url = "https://files.pythonhosted.org/packages/64/e6/682b641ff0765ea9bdc349dbc7d223de5c8af8ec1abda0db3406992f92fe/jiter-0.17.0-cp313-cp313-win32.whl", hash = "sha256:2c45ad7c973ef33fe5114a953377b35a95240f4542c0724d9f781e47dc24bac7", size = 184334, upload-time = "2026-09-12T15:12:30.813Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d2/9a49aac2b27af4cc5015e368c0cc3588491a532f717a668ffce1f1ac57da/jiter-0.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:a3cebb1fe4a1abb00465f3f8a17e09112603e8b7c59e5c3adbcd9f7815a64acd", size = 226601, upload-time = "2026-09-12T15:12:32.096Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ce/9a43e9f614608eafa78de22aedcff54cd21324467b5d442d5c9b00244145/jiter-0.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:96b8b0c6dc5d78682f54a450785e075aa929cde768304cad363cd4efba5a82ac", size = 183103, upload-time = "2026-09-12T15:12:34.396Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/23065f8e2c7a4c372c1b6f6622e4cfab4dc786cb5150052b1527e6a6a840/jiter-0.17.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:00d783a779c5664e16dbad5e3a3c3a75e128b07dd5f4765159658d9210a50ca5", size = 292210, upload-time = "2026-09-12T15:12:35.613Z" }, + { url = "https://files.pythonhosted.org/packages/ea/81/67b58647560bc82a4490d722caa8561d7a86a9f45d4fa620b7e5fe282c7a/jiter-0.17.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0619d806e260ecf0c2a64521942c94af5d547c9ec99b55ae4f51b538b5576a76", size = 321512, upload-time = "2026-09-12T15:12:36.907Z" }, + { url = "https://files.pythonhosted.org/packages/c7/07/6658359a25f55927f7f8bf0e16465dee2ccd0b2a1a5208acc0df8972e074/jiter-0.17.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc0288ce39190ee33fe6e4ec73161eed34e7e2da509b525546ca061778d62b64", size = 343897, upload-time = "2026-09-12T15:12:38.189Z" }, + { url = "https://files.pythonhosted.org/packages/46/04/5d50a9f0319cbdc37fd53c27f8c313d46afc34f1b048219ae6d8ea068da4/jiter-0.17.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5a52a430d04225ffde633e6840bf2381d34c019ff98526b5929755b9052fb199", size = 326519, upload-time = "2026-09-12T15:12:39.532Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c7/d02517832b29eb8275fdd0f4ce0f17b80f58cc4c3ebecd4d9ace990d633d/jiter-0.17.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37f33d327900bf2879613b3363fd48df97b4232d0c41f54bcf2e790c2fc40a71", size = 341369, upload-time = "2026-09-12T15:12:41.486Z" }, + { url = "https://files.pythonhosted.org/packages/3b/07/499b5f5603501cdd93a73a6a176dfad9c96555a3ae58ca9f8e3acba63dc9/jiter-0.17.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cf564d43c4388149ca58ee571d0f5ccf875e20d1fd4662fd94cc0d1ea3b10ef", size = 352160, upload-time = "2026-09-12T15:12:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/f5/75/b04013c7743269d4533ef4e746fc0ed678a143968dd7448658e3f51daad2/jiter-0.17.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:523c499235fb65add25d4bb01b1c4709ce695efdc7deb6c0a7bc515b5c44e0fb", size = 345018, upload-time = "2026-09-12T15:12:44.192Z" }, + { url = "https://files.pythonhosted.org/packages/1d/96/cbb6fd1e42a77c8412ec4643db95059b30cdfc635e387cc9193e098ce268/jiter-0.17.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:455e4ab35cb2a4a91a8404e08fd3c621bae433922e59bf1c494fe20a426b013b", size = 329244, upload-time = "2026-09-12T15:12:45.491Z" }, + { url = "https://files.pythonhosted.org/packages/15/67/d3be402f398566a379bf40ae65be5c3505b14d9e95e0802a597ddde7ddee/jiter-0.17.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6871973bfbd4408f7f1c632b30bbb5bbd9671c1bc8650af6823e24b7be13709b", size = 335693, upload-time = "2026-09-12T15:12:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8d/98e2c4130b93d64f1d67c89060b928d04102549bf05e64451c9e6024f9ca/jiter-0.17.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:77f6aac0137309b31448c1bdcda4c6c77077664a6d018ece8d94019c68a5a5b9", size = 484329, upload-time = "2026-09-12T15:12:48.361Z" }, + { url = "https://files.pythonhosted.org/packages/78/5e/8da91e49f0fbca37c3489fb4cf3ad6676d4965f00ae5468bca3a2513737a/jiter-0.17.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:93946d89fa04d5ba64dd323a8dd8d901676cb8a3c81d99ae4f6c051a9b4c3f2f", size = 521358, upload-time = "2026-09-12T15:12:49.856Z" }, + { url = "https://files.pythonhosted.org/packages/be/21/5388684a5a38af3557cd9c2424b9827c71809cff24373c75ef9d0d3dfba9/jiter-0.17.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:70f19a2ca8429f91e82eeffb2f51cb87bc2d6e953b009b91a92d29c3a16ccb03", size = 110459, upload-time = "2026-09-12T15:12:51.747Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ad/58b3a93525d2ffca7f54d9dee441381990082bd1172fbeb8d6a3f72a4dc3/jiter-0.17.0-cp314-cp314-win32.whl", hash = "sha256:71dbd74314c5df52a1bccf7b8bca46d14e943af7a2012e73b23f49977ef194c8", size = 185043, upload-time = "2026-09-12T15:12:54.477Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4a/1aa520eb6c359b262c14ff995ca7283837208ddfb1202082ce9d73cf214d/jiter-0.17.0-cp314-cp314-win_amd64.whl", hash = "sha256:ac3c6ee3264d6f5c44c617f90bc7e8b9e1587e7d6708c9d8f811cb65582ee312", size = 227163, upload-time = "2026-09-12T15:12:55.931Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e4/5997f648794bd9b499491d0ff480b096cc9a9c65bdba29f57568e6aa1705/jiter-0.17.0-cp314-cp314-win_arm64.whl", hash = "sha256:6219adaf59711ba7063a52496e8ec6d3fa3e209d7827d83eee3b2abc780a1744", size = 183505, upload-time = "2026-09-12T15:12:58.196Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4a/84a5ec271d09f7590b6073af5ee4abb44eab4ccace453b7e2c5ce45234ca/jiter-0.17.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:59bddbe6f9ffecc68d641e1e2d619ce64cf8a9e9eeb74e5c518f74fc87abf1b0", size = 321527, upload-time = "2026-09-12T15:12:59.394Z" }, + { url = "https://files.pythonhosted.org/packages/39/71/9e1fd0045f5920b4c36be35c3f0f0dfd123668684f8ad352619d7aa44183/jiter-0.17.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cb41cd1432f1dc19a231cf70b54d42b2c9f05085155859263fce06fa4d41388", size = 340865, upload-time = "2026-09-12T15:13:00.756Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2b/14627fd2bc377f3dd09491bcace6b90e34b4d7fea2f1f3295031ff91f528/jiter-0.17.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd7790aa79c8b518e512ebcdfce9f11d8ef5f30efd43720c8a19a548b39fa489", size = 325412, upload-time = "2026-09-12T15:13:02.152Z" }, + { url = "https://files.pythonhosted.org/packages/4c/f3/8d5808f7bf0f456bde79e6393587183a0cee5f83d179fe1f7f1eff2ba067/jiter-0.17.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbbfe4e3c21c8166980cddc5bee1a315df082454f007947dfb6fb73800768165", size = 340473, upload-time = "2026-09-12T15:13:03.485Z" }, + { url = "https://files.pythonhosted.org/packages/4f/da/1d8c7c6c4ae6b2423b94a81b6b907d37b28f87664e077427b531bf1b5313/jiter-0.17.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c286860abfe8b100cac1c02e225e5776eb9216edd71ba17cdb237da4af32bc9", size = 350757, upload-time = "2026-09-12T15:13:04.828Z" }, + { url = "https://files.pythonhosted.org/packages/eb/96/c1813dcca15c5a370145a448aaea7d1f83f6f0228a5f1130e79340ee385f/jiter-0.17.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f753eb70b1474a29e635e7542ff7312e6d6b951e0b25e8a2e8c34eeb1ddcd478", size = 345203, upload-time = "2026-09-12T15:13:06.131Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f7/fc61cbcf2992d169ede13648fc3fd8e2d3171a3669dde43cd4db556549ac/jiter-0.17.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:eae86b1f027031e39db2e0e9c4842221edb7b8cd474d23f87a79b3bd4b651768", size = 328322, upload-time = "2026-09-12T15:13:07.392Z" }, + { url = "https://files.pythonhosted.org/packages/8f/88/46418a3abbdffb7dc41b314200360f24f75faaeb35573e81c92de322cce9/jiter-0.17.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bf350452a43173e69e1fc74847c57a60e3d7515807287f29849baa2a85d8718", size = 336570, upload-time = "2026-09-12T15:13:08.666Z" }, + { url = "https://files.pythonhosted.org/packages/f0/28/b8a55b949be6306df8888e365a8df05441de8a7b11289f6957004302e41e/jiter-0.17.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:da139721f4b7cafdbff580a4f511ea24cb91f4909330c6b926a1ca53836c0a59", size = 482879, upload-time = "2026-09-12T15:13:10.037Z" }, + { url = "https://files.pythonhosted.org/packages/75/3b/21d0afa53ba0680962c39f3eb95ed2946f8793369ed44b0c82b490723081/jiter-0.17.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:8079849db9a1371bfd90bad088458a8fb836261879df2233cc9632464ecf64e1", size = 520406, upload-time = "2026-09-12T15:13:11.456Z" }, + { url = "https://files.pythonhosted.org/packages/ef/03/bcbaf8b6b9ea23c2c074411f8ecfbb02d820abac5d0cb8f4e280209174a2/jiter-0.17.0-cp314-cp314t-win32.whl", hash = "sha256:8f770b0c77e5fac482e1ba03ca1a7e18286bfb213d749932a00a7e4cd5de5e06", size = 184434, upload-time = "2026-09-12T15:13:13.037Z" }, + { url = "https://files.pythonhosted.org/packages/7a/b5/5d6ce2c93ef6fe1241b37a9005547f9b6d58db1f07f39fe95807d4b98f51/jiter-0.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c4289293e5278d9314b00f15c37f2120fa51d3d68565292e715524c750e775a9", size = 227392, upload-time = "2026-09-12T15:13:14.933Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4b/1e52baf90187606e33a7b8cfa8f96f5829acd7f01870077eb01059ab76d0/jiter-0.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4dfbfe5a6e1e80a7082af559f66386405025ec278833e0c649f69cbc6e1004cc", size = 182776, upload-time = "2026-09-12T15:13:16.239Z" }, + { url = "https://files.pythonhosted.org/packages/05/fc/efe3ac75564ab10f53517958f5ccdc231fc7334af66c76776cb554a88967/jiter-0.17.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:84963d3f395ef5e9a32ce47155e08a7962fa292c159a10cb98b931cef1416925", size = 292143, upload-time = "2026-09-12T15:13:17.502Z" }, + { url = "https://files.pythonhosted.org/packages/d1/4c/46982118d91f9ffe9714319d21ec4f98d9b7e0cfd9062826c524a54de24e/jiter-0.17.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:ffa0380ad091de7d3fc33e17a97ff479851ee18a0a2a3ee56ff3215cdc886656", size = 321341, upload-time = "2026-09-12T15:13:19.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/12/9b1ac6ecc6307049913db54839ddba1c11c1ef72c5a8bbb5514bc3b50d1b/jiter-0.17.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:755079792868ce5d4938e83b91a0939b34fb858a1ca65a104f2d771bea57faa1", size = 344383, upload-time = "2026-09-12T15:13:20.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b6/527cc72af836d824e9d4d666e64f0a1ca7eafd662a8da9657b78592172ba/jiter-0.17.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3bf4dc2b84a464117fb097d15a25c58d100d2692888e3b0d92df5b48ed16b7c0", size = 326841, upload-time = "2026-09-12T15:13:21.83Z" }, + { url = "https://files.pythonhosted.org/packages/d1/41/567f98617e88005b249503b933803f633ec6ba2d427cf4cc35e5c832125c/jiter-0.17.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02a360707033d8cef53f7f3480817a1489177a259ec6ec01e98c37e0b922ddca", size = 341354, upload-time = "2026-09-12T15:13:23.323Z" }, + { url = "https://files.pythonhosted.org/packages/40/da/b29cda895b785f7d426e224638a885b6145a08ce853b381f34afe3e88c5d/jiter-0.17.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:300ce01ab0215e3dea4d00090143c909aedc65c0f809b3c07983e1d038f291b9", size = 351985, upload-time = "2026-09-12T15:13:26.526Z" }, + { url = "https://files.pythonhosted.org/packages/f7/5c/8a73829e7389e72ea298a450f2b3cb58e71a3e464b45f6d8753740f1c4f5/jiter-0.17.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746243a080b4ca790b8499af3d7cf9825d5f5987933950cd818e767ee353d826", size = 346052, upload-time = "2026-09-12T15:13:27.887Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2f/98d6001026932c095ba440925570123043bed29f5ff56158dfe729a9e81b/jiter-0.17.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:b550585523339b71cb852b811aae49d08d7601ad8ffe9f5dc1562f4c3d22fd87", size = 329159, upload-time = "2026-09-12T15:13:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/94/2e/708dc1d2678f092c31c12754e860cd8353e6a85ecbdb1010157edca0da9e/jiter-0.17.0-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0239520085cac678e77a606fd7e3f1c60c371d719790c5e3807388d3da4354c2", size = 336001, upload-time = "2026-09-12T15:13:32.846Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f0/75a5ae38862f4eaf0fe2f8a9fbf6484c4890df04c06dcdffc45e36bca61a/jiter-0.17.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:eb2295da7c3769f6719b227a237aa6a5cfa6550e478bc838001b592c57e16575", size = 484281, upload-time = "2026-09-12T15:13:35.333Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/6636fae811c27c7f93e1b11fb5800de6a5c9e4269a27cf718e0b31218ad1/jiter-0.17.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:e088612ff90ebc9247e1a43074b72835804261c47e6a6c01cb3ddcb55360d688", size = 521300, upload-time = "2026-09-12T15:13:37.101Z" }, + { url = "https://files.pythonhosted.org/packages/61/aa/12df7e0b0b1a2602e3d5a5a7104d7d9700f254b400f134a9b50955c4d231/jiter-0.17.0-cp315-cp315-win32.whl", hash = "sha256:0b52d52035b3907c5b1f6277857b29c1cbfc965e24e0f27330dbed83edb591ec", size = 185138, upload-time = "2026-09-12T15:13:38.901Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ec/3dd2e495032cddde05723c1f4c743b67a23e55d2af244692a7f58f0cdae3/jiter-0.17.0-cp315-cp315-win_amd64.whl", hash = "sha256:10f5558eed511b830488003449d942bd75829ad6257dc58cb9a03e596a7777b1", size = 226950, upload-time = "2026-09-12T15:13:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c7/ef85704e0a57e9cadb2babc05f6d7c5df4a1c75da1a6ee31e1986b0099a5/jiter-0.17.0-cp315-cp315-win_arm64.whl", hash = "sha256:fa13acf1046f95df808c64b1310705e143fab87aee73ae00cc42d640867fd2c1", size = 183618, upload-time = "2026-09-12T15:13:41.432Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9a/a4b348349de68762b58d6713973d363ad80a1c741d0bf8def7975f0ecb26/jiter-0.17.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:af2f7501580f274b63c4b2283bc425f5df7edf06ae5b171e5f87d912ff359a20", size = 321155, upload-time = "2026-09-12T15:13:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/aebd6d0b5f0677de3a3d0bdc4a05fac949b97c4ede454c8809f180ac7b17/jiter-0.17.0-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10c5349312e5cb02b7a21e123a57665afa895953f05bf252a9dd4c13a572b7ab", size = 340985, upload-time = "2026-09-12T15:13:44.115Z" }, + { url = "https://files.pythonhosted.org/packages/a7/82/4c3b49796b5eb62f3f5046f957683f4ba0135fe1a60957c11180512460df/jiter-0.17.0-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86f3f9343a288eb85a81ef20a752b2f84564296636db54a9fff0b5c8deaf1df2", size = 325670, upload-time = "2026-09-12T15:13:45.901Z" }, + { url = "https://files.pythonhosted.org/packages/bc/43/f6341ecb4872202a4ef150486fcee0e1ace4aa3da39b71b82061452cdd3a/jiter-0.17.0-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4607ec7d93355fbc25b8dc5189153cf21d66063b9f9cd04dd2774e6e783f9b6a", size = 340339, upload-time = "2026-09-12T15:13:47.442Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c4/bc2c86e08fa065e03cb2fbc53b367c3640a7d257ef9d877b29118ea636b7/jiter-0.17.0-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10cd64a5720ad7f809ac5466ff1705813f1b6b510f195a73acafba0ac0e1f675", size = 350705, upload-time = "2026-09-12T15:13:48.848Z" }, + { url = "https://files.pythonhosted.org/packages/9d/67/91f12aa111cca6e3a197c3e36bf60a034bf9f122f6d41112a639e44217d8/jiter-0.17.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe9f61bb30174d2f5c8396445c360c96c44e78164d0815dfe627ccf57849574", size = 345011, upload-time = "2026-09-12T15:13:50.215Z" }, + { url = "https://files.pythonhosted.org/packages/f5/cb/9f5556e8f6ec89755fb5a709d8eb8270c9a324e31079eda0dfbeca451b6e/jiter-0.17.0-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:370d8fe5bf201dc6925e8a84c81ac7291f74d9fd1778234fc79d517064a5c76b", size = 328268, upload-time = "2026-09-12T15:13:51.809Z" }, + { url = "https://files.pythonhosted.org/packages/22/98/153f20680fb75781a490fb849940e2b00f95035c7aa054df592f36ed33fc/jiter-0.17.0-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b303d88e6a0bda789ec4b7801c7bad68e27230ba1fe4baffc756d1fbd32dc9d", size = 337024, upload-time = "2026-09-12T15:13:53.095Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b16c9be3a5035df4466cc72e888188c027562de90a723d290ab6814cb9d4/jiter-0.17.0-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:30793a24a31e968969757c9e08d830cbb15a2cd3c4959b4498b38f4b1c2258eb", size = 482766, upload-time = "2026-09-12T15:13:55.713Z" }, + { url = "https://files.pythonhosted.org/packages/d0/55/667dea313094024bef082175d6bfe8976f90d1c00c926af9df1d8e0eab48/jiter-0.17.0-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:686c93d86f2b426c803024b805bd161a6cd10e9627c23e901640eab646c0ad8a", size = 520367, upload-time = "2026-09-12T15:13:57.674Z" }, + { url = "https://files.pythonhosted.org/packages/21/e3/4b1a43501fb9ed17b01d137e380cb0e8fdcb39a254ce31aa2ab95bc861ac/jiter-0.17.0-cp315-cp315t-win32.whl", hash = "sha256:86d703d9faa1ffc8ae4e9de0fa007712ed2171b5c0d93811a8e2e105ac729b0d", size = 184603, upload-time = "2026-09-12T15:13:59.27Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f2/b8ee0372b6ebdf1bde5cc44495d5291d17f961065f5b48f8616cc67cac2e/jiter-0.17.0-cp315-cp315t-win_amd64.whl", hash = "sha256:42b0260445251b1bc520a63baa94a32d88e0f931fba234f1764db7feb7c72174", size = 227936, upload-time = "2026-09-12T15:14:00.472Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b4/923a1215daba959aed8355973315cb3f81f53e0d01c5b211870a27b41f45/jiter-0.17.0-cp315-cp315t-win_arm64.whl", hash = "sha256:d47687806f9c54c84ea38733507081337922beca90ce819c7d852dd485bc0f23", size = 182977, upload-time = "2026-09-12T15:14:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3b/05a917204413e2e09906dfa35240c1021227aeb56c7305abea9562c598b4/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:eaba834b72d573547b9d966465b3394b749d5e14208cc70acb63aca37619ab33", size = 288143, upload-time = "2026-09-12T15:14:02.998Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e1/a1cd3c0cf8f79945939e4f8caae9990529f67d7f77f671769f73956329b9/jiter-0.17.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:51e1519d676a9f14dad9c2a411170d43b022ddb7989562df4e849b261ce127b2", size = 281847, upload-time = "2026-09-12T15:14:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/72/b4/9b797679e09f4a46c32986aeb3670bd9bc562fc0b373c7a0ee5c5dce1206/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ce4feb52493e3513335b2accdcd75605652e4632772d3c8c2f7b86954d7f39", size = 304797, upload-time = "2026-09-12T15:14:05.733Z" }, + { url = "https://files.pythonhosted.org/packages/25/4a/0d77415b27a00d970e4e710f7c1de62e96a11c4cab3ed1add0015af04626/jiter-0.17.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29f49b325e0234e4ad9ecca5b861ffbd09b95ccac9bd46fa55841b6e56eea5fe", size = 307815, upload-time = "2026-09-12T15:14:07.105Z" }, + { url = "https://files.pythonhosted.org/packages/17/31/4bb27f54333d3b9ef1e5bd3312dc0b4bbe59c68bb0885fdb40583a6b1567/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:454c4997d73cc466c71fd565d91e603b0274e48ea0c6b0b7a7aee6967e4ceb7c", size = 288415, upload-time = "2026-09-12T15:14:08.455Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/879570ecf82574eaea77c5eb10309f4b630dece5f2a556e9814a90ba3f2d/jiter-0.17.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:40d2c240f8f80b5b0f201b29f0ae129c81448c60c772227a41747b5e0026f6a2", size = 279113, upload-time = "2026-09-12T15:14:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/77/7a/1f0b8a35fbd079a4f1752c31a15dc99cf277f863747c459be0af39e900e5/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e05f5adbf68c4bd11e1610f394034d984152988e84be6f8314235ce6f2139e5", size = 303708, upload-time = "2026-09-12T15:14:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/e1/8b/d76219ebdbcf3d4209d9d21a0810db4c8d0a6f88e3ee87d30bdea4e90d30/jiter-0.17.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2c0bf24c72fd0491405dce5d40194f2070e9021ce648c1a1d46234b93d848ff", size = 307147, upload-time = "2026-09-12T15:14:12.897Z" }, ] [[package]] @@ -3818,9 +4139,9 @@ name = "jsonschema-path" version = "0.4.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pathable" }, - { name = "pyyaml" }, - { name = "referencing" }, + { name = "pathable", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyyaml", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "referencing", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5b/8a/7e6102f2b8bdc6705a9eb5294f8f6f9ccd3a8420e8e8e19671d1dd773251/jsonschema_path-0.4.5.tar.gz", hash = "sha256:c6cd7d577ae290c7defd4f4029e86fdb248ca1bd41a07557795b3c95e5144918", size = 15113, upload-time = "2026-03-03T09:56:46.87Z" } wheels = [ @@ -3844,13 +4165,13 @@ name = "keyring" version = "25.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, - { name = "jaraco-classes" }, - { name = "jaraco-context" }, - { name = "jaraco-functools" }, - { name = "jeepney", marker = "sys_platform == 'linux'" }, - { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, - { name = "secretstorage", marker = "sys_platform == 'linux'" }, + { name = "importlib-metadata", marker = "(python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jaraco-classes", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jaraco-context", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jaraco-functools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jeepney", marker = "(sys_platform == 'linux' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'linux' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'linux' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'linux' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pywin32-ctypes", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "secretstorage", marker = "(sys_platform == 'linux' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'linux' and extra == 'extra-8-band-sdk-parlant') or (sys_platform != 'linux' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'linux' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } wheels = [ @@ -4152,7 +4473,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "langchain-core" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, { name = "tiktoken" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/68/dd7f7ef76efe58222d37f1b1a5595b1bb368fc9165f71526db26e4c5759e/langchain_openai-1.7.0.tar.gz", hash = "sha256:7df2db16d32320ba563b7e4291a71ec6bf7b0ea8a5369ed2a0501d74928ea6d0", size = 3404806, upload-time = "2026-10-08T16:07:35.135Z" } @@ -4249,7 +4571,7 @@ version = "0.7.32" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpx" }, - { name = "orjson", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "orjson", marker = "platform_python_implementation != 'PyPy' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "packaging" }, { name = "pydantic" }, { name = "requests" }, @@ -4406,9 +4728,9 @@ name = "limits" version = "5.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "deprecated" }, - { name = "packaging" }, - { name = "typing-extensions" }, + { name = "deprecated", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/71/69/826a5d1f45426c68d8f6539f8d275c0e4fcaa57f0c017ec3100986558a41/limits-5.8.0.tar.gz", hash = "sha256:c9e0d74aed837e8f6f50d1fcebcf5fd8130957287206bc3799adaee5092655da", size = 226104, upload-time = "2026-02-05T07:17:35.859Z" } wheels = [ @@ -4432,24 +4754,24 @@ name = "litellm" version = "1.105.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiohttp", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "boto3", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "click", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "fastuuid", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx", extra = ["http2"], marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "huggingface-hub", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "importlib-metadata", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "jinja2", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "jsonschema", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "openai", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "packaging", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic-settings", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "python-dotenv", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pyyaml", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tiktoken", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "tokenizers", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "aiohttp", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "boto3", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "click", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "fastuuid", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "httpx", extra = ["http2"], marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "huggingface-hub", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "importlib-metadata", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "jinja2", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "jsonschema", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "packaging", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "pydantic", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "pydantic-settings", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "python-dotenv", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "pyyaml", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "tiktoken", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "tokenizers", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/3e/35/f326093937d03fbca3e25c42f42708854b9321af841db29ce28235f6237a/litellm-1.105.0.tar.gz", hash = "sha256:f4af675e480ba7cf1f43c2bf5e480564b547e0e58d31e88f724daa0a0967b065", size = 20320691, upload-time = "2026-10-11T09:48:15.603Z" } wheels = [ @@ -4485,23 +4807,69 @@ name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", -] -dependencies = [ - { name = "mdurl", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", +] +dependencies = [ + { name = "mdurl", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -4511,24 +4879,18 @@ resolution-markers = [ "python_full_version >= '3.14' and sys_platform != 'win32'", "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version < '3.13' and sys_platform == 'win32'", + "(python_full_version < '3.12' and sys_platform == 'emscripten') or (python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32')", ] dependencies = [ - { name = "mdurl", marker = "extra == 'extra-8-band-sdk-crewai' or extra != 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "mdurl", marker = "extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-pydantic-ai')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] -[package.optional-dependencies] -linkify = [ - { name = "linkify-it-py" }, -] - [[package]] name = "markupsafe" version = "3.0.3" @@ -4608,15 +4970,15 @@ name = "matplotlib" version = "3.10.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "contourpy" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, + { name = "contourpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "cycler", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "fonttools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "kiwisolver", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pillow", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyparsing", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-dateutil", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } wheels = [ @@ -4674,28 +5036,27 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] dependencies = [ - { name = "anyio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "httpx-sse", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "jsonschema", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pyjwt", extra = ["crypto"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "python-multipart", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pywin32", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "sse-starlette", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "starlette", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typing-inspection", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "uvicorn", marker = "(sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai') or (sys_platform != 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "anyio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx-sse", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonschema", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pyjwt", extra = ["crypto"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-multipart", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pywin32", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "sse-starlette", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "starlette", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-inspection", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "uvicorn", marker = "(sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-crewai') or (sys_platform != 'emscripten' and extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6e/77/9450b8f251a13affb6281997d0523c4615f8a8b35d0b21ff30db3a5aac9d/mcp-1.28.1.tar.gz", hash = "sha256:d51e36a5f5644faea4f85ea649bfffa6bc6c26770d42798ad6a3de3d2ba69683", size = 638501, upload-time = "2026-06-26T12:57:29.093Z" } wheels = [ @@ -4704,8 +5065,8 @@ wheels = [ [package.optional-dependencies] cli = [ - { name = "python-dotenv", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "typer", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "python-dotenv", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typer", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -4713,14 +5074,55 @@ name = "mcp" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", ] dependencies = [ { name = "anyio", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, @@ -4731,12 +5133,12 @@ dependencies = [ { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "pyjwt", extra = ["crypto"], marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "python-multipart", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, - { name = "pywin32", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "pywin32", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai')" }, { name = "sse-starlette", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "starlette", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "typing-inspection", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, - { name = "uvicorn", marker = "(sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev') or (sys_platform != 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "uvicorn", marker = "(sys_platform != 'emscripten' and extra == 'extra-8-band-sdk-dev') or (sys_platform != 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/30/d3/f9acc21dfc886e4f78e2add1a47db46ce16884346afde53f8a064c02c891/mcp-1.29.0.tar.gz", hash = "sha256:52d01f334de1868cc3bb2d6604931126a67631f99a6c5d3b82ba47290315ec36", size = 643148, upload-time = "2026-07-28T13:41:41.939Z" } wheels = [ @@ -4754,7 +5156,7 @@ name = "mdit-py-plugins" version = "0.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ @@ -5008,10 +5410,10 @@ name = "mypy" version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, - { name = "mypy-extensions" }, - { name = "pathspec" }, - { name = "typing-extensions" }, + { name = "librt", marker = "(platform_python_implementation != 'PyPy' and extra == 'extra-8-band-sdk-dev-parlant') or (platform_python_implementation != 'PyPy' and extra == 'extra-8-band-sdk-parlant') or (platform_python_implementation == 'PyPy' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (platform_python_implementation == 'PyPy' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "mypy-extensions", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pathspec", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0b/3d/5b373635b3146264eb7a68d09e5ca11c305bbb058dfffbb47c47daf4f632/mypy-1.20.1.tar.gz", hash = "sha256:6fc3f4ecd52de81648fed1945498bf42fa2993ddfad67c9056df36ae5757f804", size = 3815892, upload-time = "2026-04-13T02:46:51.474Z" } wheels = [ @@ -5067,7 +5469,7 @@ name = "nano-vectordb" version = "0.0.4.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/ff/ed9ff1c4e5b0418687c17d02fdc453c212e7550c62622914ba0243c106bc/nano_vectordb-0.0.4.3.tar.gz", hash = "sha256:3d13074476f2b739e51261974ed44aa467725579966219734c03502c929ed3b5", size = 6332, upload-time = "2024-11-11T12:50:50.584Z" } wheels = [ @@ -5103,10 +5505,10 @@ wheels = [ [package.optional-dependencies] default = [ - { name = "matplotlib" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "scipy" }, + { name = "matplotlib", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pandas", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "scipy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -5123,10 +5525,10 @@ name = "nooa" version = "0.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "litellm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "openinference-instrumentation-litellm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pydantic", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "httpx", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "litellm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openinference-instrumentation-litellm", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "pydantic", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/27/90/f07e44b57d10e3687caba9b18a1b2064e7c9602f85fdeb9c9b0a4843aeba/nooa-0.0.10.tar.gz", hash = "sha256:91d44a48610b116561d2ddc42ed80a7c4011c7324a67236300d2fe78182d3c78", size = 3504802, upload-time = "2026-09-04T06:04:36.719Z" } wheels = [ @@ -5263,28 +5665,63 @@ wheels = [ name = "openai" version = "2.46.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform != 'win32'", +] dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter", version = "0.13.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "jiter", version = "0.14.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, + { name = "anyio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "distro", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "jiter", version = "0.13.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jiter", version = "0.17.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "sniffio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "tqdm", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/ac/f725c4efbda8657d02be684607e5a2e5ce362e4790fdbcbdfb7c15018647/openai-2.46.0.tar.gz", hash = "sha256:0421e0735ac41451cad894af4cddf0435bfbf8cbc538ac0e15b3c062f2ddc06a", size = 1114628, upload-time = "2026-07-17T02:48:06.05Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ea/7b/206238ebcb50b235942b1c66dba4974776f2057402a8d91c399be587d66a/openai-2.46.0-py3-none-any.whl", hash = "sha256:672381db55efb3a1e2610f29304c130cccdd0b319bace4d492b2443cb64c1e7c", size = 1637556, upload-time = "2026-07-17T02:48:03.695Z" }, ] +[[package]] +name = "openai" +version = "3.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform != 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform != 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten'", + "python_full_version < '3.13' and sys_platform == 'win32'", + "(python_full_version < '3.12' and sys_platform == 'emscripten') or (python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32')", +] +dependencies = [ + { name = "anyio", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "httpx2", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "jiter", version = "0.17.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "sniffio", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/99/d0c5b9e60eb131bfe5f6f818e9b25650b64004ff84512c0f7e00a246b826/openai-3.31.0.tar.gz", hash = "sha256:58110edba9acaf29cb2a675a1cbcccdd9f2fdb4932baed474dc847a7639e5d02", size = 2117207, upload-time = "2026-10-14T05:39:33.445Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/22/66014c8fede0aa2b3381cf80c5102219b78657b3e61776cdab8f0b78675a/openai-3.31.0-py3-none-any.whl", hash = "sha256:e5839f6670483f368de40ce3422f524c1afaf12ff8660539f53489e200db8d78", size = 2235454, upload-time = "2026-10-14T05:39:31.197Z" }, +] + [[package]] name = "openapi-pydantic" version = "0.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } wheels = [ @@ -5296,12 +5733,12 @@ name = "openapi-schema-validator" version = "0.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonschema" }, - { name = "jsonschema-specifications" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "referencing" }, - { name = "rfc3339-validator" }, + { name = "jsonschema", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonschema-specifications", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "referencing", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rfc3339-validator", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/21/4b/67b24b2b23d96ea862be2cca3632a546f67a22461200831213e80c3c6011/openapi_schema_validator-0.8.1.tar.gz", hash = "sha256:4c57266ce8cbfa37bb4eb4d62cdb7d19356c3a468e3535743c4562863e1790da", size = 23134, upload-time = "2026-03-02T08:46:29.807Z" } wheels = [ @@ -5313,12 +5750,12 @@ name = "openapi-spec-validator" version = "0.8.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "jsonschema" }, - { name = "jsonschema-path" }, - { name = "lazy-object-proxy" }, - { name = "openapi-schema-validator" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, + { name = "jsonschema", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonschema-path", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "lazy-object-proxy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openapi-schema-validator", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic-settings", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/10/de/0199b15f5dde3ca61df6e6b3987420bfd424db077998f0162e8ffe12e4f5/openapi_spec_validator-0.8.4.tar.gz", hash = "sha256:8bb324b9b08b9b368b1359dec14610c60a8f3a3dd63237184eb04456d4546f49", size = 1756847, upload-time = "2026-03-01T15:48:19.499Z" } wheels = [ @@ -5330,8 +5767,8 @@ name = "openapi3-parser" version = "1.1.21" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "openapi-spec-validator" }, - { name = "prance" }, + { name = "openapi-spec-validator", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "prance", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/93/0fd92e1d9d4e5432e1d206e1648b02d125dc9d2551a8f525d8c433cb08b7/openapi3_parser-1.1.21.tar.gz", hash = "sha256:6ad5a4c307fdabb371c3191dc608968b68db433238f218591ff825c8d28aaa75", size = 15208, upload-time = "2025-04-24T20:18:19.42Z" } wheels = [ @@ -5343,10 +5780,10 @@ name = "openinference-instrumentation" version = "0.1.71" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "openinference-semantic-conventions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-api", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-sdk", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "wrapt", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "openinference-semantic-conventions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "opentelemetry-api", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "opentelemetry-sdk", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "wrapt", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/56/ec/ef1ca7e409ee6bddb7278b9760e0941f65911748f5dc84d17c115f6648f1/openinference_instrumentation-0.1.71.tar.gz", hash = "sha256:4d267b6ce8e067572a740d6a0dbf6b4d4c6e386c5a52a7e7f61e3a714a49849d", size = 46600, upload-time = "2026-10-07T20:26:41.084Z" } wheels = [ @@ -5358,13 +5795,13 @@ name = "openinference-instrumentation-litellm" version = "0.1.50" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "openinference-instrumentation", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "openinference-semantic-conventions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-api", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-instrumentation", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "opentelemetry-sdk", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "setuptools", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "wrapt", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "openinference-instrumentation", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "openinference-semantic-conventions", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "opentelemetry-api", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "opentelemetry-instrumentation", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "opentelemetry-sdk", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "setuptools", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, + { name = "wrapt", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/67/06/8c3b91c2399726c9286e1b1894b48898a19f7a49c1435adf232054766522/openinference_instrumentation_litellm-0.1.50.tar.gz", hash = "sha256:ab483a9455313cae3d572ff21b65e665ad9f2964f7d8ccaaecee06605851f174", size = 115691, upload-time = "2026-10-09T18:29:10.739Z" } wheels = [ @@ -5456,8 +5893,8 @@ name = "opentelemetry-exporter-otlp" version = "1.45.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "opentelemetry-exporter-otlp-proto-http" }, + { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp-proto-http", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e3/6f/5a561048ea372894f22f58f70e8478e4cd97d9a4e2d6f014559584a29bc5/opentelemetry_exporter_otlp-1.45.1.tar.gz", hash = "sha256:d0ac35592e77663a9fabf2740b4818c57196b1b764e0c8449d0d7bb2c7b2bc67", size = 6094, upload-time = "2026-10-06T17:33:00.966Z" } wheels = [ @@ -5493,14 +5930,14 @@ name = "opentelemetry-exporter-otlp-proto-grpc" version = "1.45.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos" }, - { name = "grpcio" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-common" }, - { name = "opentelemetry-exporter-otlp-proto-common" }, - { name = "opentelemetry-proto" }, - { name = "opentelemetry-sdk" }, - { name = "typing-extensions" }, + { name = "googleapis-common-protos", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "grpcio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-api", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp-common", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp-proto-common", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-proto", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-sdk", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d6/00/a82af0be959dc58495740b169c6669a86e0811f6cd353a01eda34d255db3/opentelemetry_exporter_otlp_proto_grpc-1.45.1.tar.gz", hash = "sha256:3b3dcfbfdcb4e35149fcf309972282054b45228f5c10547d0095d6578510a9a0", size = 25997, upload-time = "2026-10-06T17:33:05.114Z" } wheels = [ @@ -5532,10 +5969,10 @@ name = "opentelemetry-instrumentation" version = "0.66b1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-api" }, - { name = "opentelemetry-semantic-conventions" }, - { name = "packaging" }, - { name = "wrapt" }, + { name = "opentelemetry-api", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-semantic-conventions", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "wrapt", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/03/89e47ff8d52a4f83b343e6eb9ef1698ff45357216e5b6b2b21e0da5c5c7d/opentelemetry_instrumentation-0.66b1.tar.gz", hash = "sha256:e79a510f7d87c72d95e964ddb42193a0d9a75668c027d980eab032ea1322a5ce", size = 43308, upload-time = "2026-10-06T17:36:10.703Z" } wheels = [ @@ -5762,9 +6199,9 @@ name = "pandas" version = "3.0.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, - { name = "python-dateutil" }, - { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-dateutil", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tzdata", marker = "(sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/da/99/b342345300f13440fe9fe385c3c481e2d9a595ee3bab4d3219247ac94e9a/pandas-3.0.2.tar.gz", hash = "sha256:f4753e73e34c8d83221ba58f232433fca2748be8b18dbca02d242ed153945043", size = 4645855, upload-time = "2026-03-31T06:48:30.816Z" } wheels = [ @@ -5822,56 +6259,57 @@ name = "parlant" version = "3.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiofiles", version = "25.1.0", source = { registry = "https://pypi.org/simple" } }, - { name = "aiopenapi3" }, - { name = "aiorwlock" }, - { name = "authlib" }, - { name = "boto3" }, - { name = "cachetools" }, - { name = "click" }, - { name = "colorama" }, - { name = "coloredlogs" }, - { name = "contextvars" }, - { name = "croniter" }, - { name = "fastapi" }, - { name = "fastmcp" }, - { name = "griffe" }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "jsonfinder" }, - { name = "jsonschema" }, - { name = "lagom" }, - { name = "limits" }, - { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" } }, - { name = "more-itertools" }, - { name = "nano-vectordb" }, - { name = "nanoid" }, - { name = "networkx", extra = ["default"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "openai" }, - { name = "openapi3-parser" }, - { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp" }, - { name = "opentelemetry-instrumentation" }, - { name = "opentelemetry-sdk" }, - { name = "parlant-client" }, - { name = "python-dateutil" }, - { name = "python-dotenv" }, - { name = "requests" }, - { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "semver" }, - { name = "starlette" }, - { name = "structlog" }, - { name = "tabulate" }, - { name = "tiktoken" }, - { name = "tokenizers" }, - { name = "toml" }, - { name = "types-aiofiles" }, - { name = "types-cachetools" }, - { name = "types-croniter" }, - { name = "types-jsonschema" }, - { name = "uvicorn" }, - { name = "websocket-client" }, - { name = "wsproto" }, + { name = "aiofiles", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "aiopenapi3", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "aiorwlock", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "authlib", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "boto3", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "cachetools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "click", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "colorama", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "coloredlogs", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "contextvars", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "croniter", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "fastapi", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "fastmcp", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "griffe", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jinja2", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonfinder", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jsonschema", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "lagom", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "limits", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "more-itertools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "nano-vectordb", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "nanoid", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "networkx", extra = ["default"], marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "openapi3-parser", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-api", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-exporter-otlp", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-instrumentation", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "opentelemetry-sdk", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "parlant-client", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-dateutil", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "python-dotenv", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "requests", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "semver", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "starlette", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "structlog", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tabulate", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tiktoken", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "tokenizers", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "toml", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "types-aiofiles", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "types-cachetools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "types-croniter", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "types-jsonschema", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "uvicorn", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "websocket-client", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "wsproto", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/a3/047bec94bf6b01812766a68b660bad68819c01adf5a75958ed54cb23f1f0/parlant-3.3.2.tar.gz", hash = "sha256:d4fa34b4f58ccfdacaf88dbe855b96f1d4e8c1ad7e2f2239946ba6c17a7ea6fc", size = 95261377, upload-time = "2026-04-28T06:29:43.471Z" } wheels = [ @@ -5883,10 +6321,10 @@ name = "parlant-client" version = "3.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "httpx" }, - { name = "mypy" }, - { name = "nanoid" }, - { name = "pydantic" }, + { name = "httpx", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "mypy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "nanoid", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pydantic", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/57/4a7f82db584d5a02d270a1723ae96b8bc04ae927731b9c4f8bccb58f05a8/parlant_client-3.3.1.tar.gz", hash = "sha256:c8bbdaaac6718a71376fe2d539254b6f1ef4a82002278d0bd6dc5c9843732f9b", size = 55113, upload-time = "2026-04-14T14:15:18.45Z" } wheels = [ @@ -6130,10 +6568,10 @@ name = "prance" version = "25.4.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "chardet" }, - { name = "packaging" }, - { name = "requests" }, - { name = "ruamel-yaml" }, + { name = "chardet", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "requests", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "ruamel-yaml", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ae/5c/afa384b91354f0dbc194dfbea89bbd3e07dbe47d933a0a2c4fb989fc63af/prance-25.4.8.0.tar.gz", hash = "sha256:2f72d2983d0474b6f53fd604eb21690c1ebdb00d79a6331b7ec95fb4f25a1f65", size = 2808091, upload-time = "2025-04-07T22:22:36.739Z" } wheels = [ @@ -6299,8 +6737,8 @@ name = "py-key-value-aio" version = "0.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "beartype" }, - { name = "typing-extensions" }, + { name = "beartype", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } wheels = [ @@ -6309,14 +6747,14 @@ wheels = [ [package.optional-dependencies] filetree = [ - { name = "aiofile" }, - { name = "anyio" }, + { name = "aiofile", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "anyio", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] keyring = [ - { name = "keyring" }, + { name = "keyring", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] memory = [ - { name = "cachetools" }, + { name = "cachetools", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -6564,7 +7002,7 @@ wheels = [ [package.optional-dependencies] email = [ - { name = "email-validator" }, + { name = "email-validator", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] [[package]] @@ -6590,6 +7028,10 @@ wheels = [ anthropic = [ { name = "anthropic" }, ] +openai = [ + { name = "openai", version = "3.31.0", source = { registry = "https://pypi.org/simple" } }, + { name = "tiktoken" }, +] [[package]] name = "pydantic-core" @@ -6836,11 +7278,11 @@ name = "pytest" version = "9.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, + { name = "colorama", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "iniconfig", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pluggy", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pygments", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } wheels = [ @@ -6852,8 +7294,8 @@ name = "pytest-asyncio" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "typing-extensions", marker = "(python_full_version < '3.13' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-nooa') or (python_full_version < '3.13' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.13' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" } wheels = [ @@ -6865,9 +7307,9 @@ name = "pytest-cov" version = "7.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "coverage", extra = ["toml"], marker = "extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pluggy" }, - { name = "pytest" }, + { name = "coverage", extra = ["toml"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pluggy", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } wheels = [ @@ -6892,8 +7334,8 @@ name = "pytest-markdown-docs" version = "0.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" } }, - { name = "pytest" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/59/c7/6953e9e25d90d038600e65b05265693aef7ae2a2b67e0f170d65f4f16c24/pytest_markdown_docs-0.9.2.tar.gz", hash = "sha256:bf7510fdeec90d3e98ac924561c01de8dbaf4c3ad34f2418ed2b0b12e5a3f4f5", size = 10929, upload-time = "2026-03-23T12:35:04.804Z" } wheels = [ @@ -6905,7 +7347,7 @@ name = "pytest-mock" version = "3.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/7f/6ed29931d5c8cd396e7c0a55412e6cc88020373365c8685985dea53d26d7/pytest_mock-3.16.0.tar.gz", hash = "sha256:5a8395528b8f498205f3718f575228d0edaed7425fff638f87d1a6c3e0383636", size = 35362, upload-time = "2026-09-27T14:57:55.46Z" } wheels = [ @@ -6917,8 +7359,8 @@ name = "pytest-rerunfailures" version = "16.7" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "packaging" }, - { name = "pytest" }, + { name = "packaging", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d1/b0/6b5337f9d59b26b0069ea3d5e863c31dc04b69e51bbfb1cf2ea6328fba87/pytest_rerunfailures-16.7.tar.gz", hash = "sha256:6956ddfb65ca1d07e7e3d99e2c5359d82300f4cb062e6049563bd2c106f72d5c", size = 59666, upload-time = "2026-09-17T07:08:48.871Z" } wheels = [ @@ -6930,7 +7372,7 @@ name = "pytest-timeout" version = "2.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pytest" }, + { name = "pytest", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-dev-strands-nooa' or extra == 'extra-8-band-sdk-nooa' or extra == 'extra-8-band-sdk-parlant' or extra != 'extra-8-band-sdk-pydantic-ai' or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ac/82/4c9ecabab13363e72d880f2fb504c5f750433b2b6f16e99f4ec21ada284c/pytest_timeout-2.4.0.tar.gz", hash = "sha256:7e68e90b01f9eff71332b25001f85c75495fc4e3a836701876183c4bcfd0540a", size = 17973, upload-time = "2025-05-05T19:44:34.99Z" } wheels = [ @@ -6954,8 +7396,8 @@ name = "python-discovery" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0c/57/250bd238b966cece44328235eb85290045d059265fdaf7527a3a958123db/python_discovery-1.6.1.tar.gz", hash = "sha256:cf87d3627dfb4412437fdd5b13eae402607722998d21567993aedbc59b23c15e", size = 84338, upload-time = "2026-09-18T01:31:53.971Z" } wheels = [ @@ -7091,7 +7533,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ @@ -7105,11 +7547,10 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/0b/86/07d5056945f9ec4590b518171c4254a5925832eb727b56d3c38a7476f316/regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5", size = 414811, upload-time = "2026-01-14T23:18:02.775Z" } @@ -7217,14 +7658,55 @@ name = "regex" version = "2026.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", ] sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/3a246dbf05666918bd3664d9d787f84a9108f6f43cc953a077e4a7dfdb7e/regex-2026.4.4.tar.gz", hash = "sha256:e08270659717f6973523ce3afbafa53515c4dc5dcad637dc215b6fd50f689423", size = 416000, upload-time = "2026-04-03T20:56:28.155Z" } wheels = [ @@ -7371,7 +7853,7 @@ name = "rfc3339-validator" version = "0.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "six" }, + { name = "six", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } wheels = [ @@ -7385,16 +7867,15 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] dependencies = [ - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "pygments", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "pygments", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e9/67/cae617f1351490c25a4b8ac3b8b63a4dda609295d8222bad12242dfdc629/rich-14.3.4.tar.gz", hash = "sha256:817e02727f2b25b40ef56f5aa2217f400c8489f79ca8f46ea2b70dd5e14558a9", size = 230524, upload-time = "2026-04-11T02:57:45.419Z" } wheels = [ @@ -7406,18 +7887,59 @@ name = "rich" version = "15.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", - "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", - "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", -] -dependencies = [ - { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai')" }, + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version >= '3.14' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version >= '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.13.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.13.*' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "python_full_version == '3.12.*' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", +] +dependencies = [ + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-pydantic-ai')" }, { name = "pygments", marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } @@ -7430,8 +7952,8 @@ name = "rich-rst" version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "docutils" }, - { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" } }, + { name = "docutils", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bc/6d/a506aaa4a9eaa945ed8ab2b7347859f53593864289853c5d6d62b77246e0/rich_rst-1.3.2.tar.gz", hash = "sha256:a1196fdddf1e364b02ec68a05e8ff8f6914fee10fbca2e6b6735f166bb0da8d4", size = 14936, upload-time = "2025-10-14T16:49:45.332Z" } wheels = [ @@ -7597,7 +8119,7 @@ name = "scipy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ @@ -7668,8 +8190,8 @@ name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "sys_platform != 'win32'" }, - { name = "jeepney", marker = "sys_platform != 'win32'" }, + { name = "cryptography", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "jeepney", marker = "(python_full_version != '3.12.*' and sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform != 'emscripten' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ @@ -7744,7 +8266,7 @@ name = "sqlalchemy" version = "2.0.49" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/09/45/461788f35e0364a8da7bda51a1fe1b09762d0c32f12f63727998d85a873b/sqlalchemy-2.0.49.tar.gz", hash = "sha256:d15950a57a210e36dd4cec1aac22787e2a4d57ba9318233e2ef8b2daf9ff2d5f", size = 9898221, upload-time = "2026-04-03T16:38:11.704Z" } @@ -7811,7 +8333,7 @@ version = "1.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7b/2b/3850dc6bf7ef71b088962eba31dafc6cffd2f96e577ebb0bb316df96da3e/starlette-1.7.0.tar.gz", hash = "sha256:c79f74ea63cff761804fbbfb182f1e0b440c2d07b164d24700c5a1bab5d6ff5d", size = 2736246, upload-time = "2026-09-23T07:30:26.35Z" } wheels = [ @@ -7828,8 +8350,8 @@ dependencies = [ { name = "docstring-parser" }, { name = "httpx" }, { name = "jsonschema" }, - { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, + { name = "mcp", version = "1.28.1", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "mcp", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "(extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-nooa') or (extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai')" }, { name = "opentelemetry-api" }, { name = "opentelemetry-instrumentation-threading" }, { name = "opentelemetry-sdk" }, @@ -7846,7 +8368,7 @@ wheels = [ [package.optional-dependencies] openai = [ { name = "aws-bedrock-token-generator" }, - { name = "openai" }, + { name = "openai", version = "2.46.0", source = { registry = "https://pypi.org/simple" } }, ] [[package]] @@ -7902,7 +8424,7 @@ name = "textual" version = "8.2.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "mdit-py-plugins" }, { name = "platformdirs" }, { name = "pygments" }, @@ -7919,7 +8441,7 @@ name = "tiktoken" version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "regex", version = "2026.1.15", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "regex", version = "2026.1.15", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "regex", version = "2026.4.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "requests" }, ] @@ -7974,7 +8496,7 @@ name = "tokenizers" version = "0.22.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-crewai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai')" }, + { name = "huggingface-hub", marker = "(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra == 'extra-8-band-sdk-nooa') or (python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-parlant') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-parlant') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version < '3.12' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (python_full_version >= '3.14' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant') or (extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } wheels = [ @@ -8011,11 +8533,10 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform != 'win32'", - "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.13.*' and sys_platform != 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.13.*' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform != 'win32'", - "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32'", "python_full_version < '3.12' and sys_platform != 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096, upload-time = "2024-10-02T10:46:13.208Z" } @@ -8028,8 +8549,18 @@ name = "tomli" version = "2.4.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.12' and sys_platform == 'win32'", - "python_full_version < '3.12' and sys_platform != 'win32'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands'", + "(python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands') or (python_full_version < '3.12' and sys_platform == 'emscripten' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-dev-strands-nooa' and extra != 'extra-8-band-sdk-nooa' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai' and extra != 'extra-8-band-sdk-strands')", + "python_full_version < '3.13' and sys_platform == 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", + "python_full_version < '3.12' and sys_platform != 'win32' and extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-dev-crewai' and extra != 'extra-8-band-sdk-dev-parlant' and extra != 'extra-8-band-sdk-parlant' and extra != 'extra-8-band-sdk-pydantic-ai'", ] sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } wheels = [ @@ -8104,7 +8635,7 @@ name = "tqdm" version = "4.67.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "colorama", marker = "(sys_platform == 'win32' and extra == 'extra-8-band-sdk-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-crewai') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-parlant') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-nooa') or (sys_platform == 'win32' and extra == 'extra-8-band-sdk-parlant') or (sys_platform == 'win32' and extra != 'extra-8-band-sdk-dev' and extra != 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ @@ -8126,8 +8657,8 @@ version = "0.27.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, - { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "colorama", marker = "sys_platform == 'win32' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "rich", version = "14.3.4", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "rich", version = "15.0.0", source = { registry = "https://pypi.org/simple" }, marker = "extra == 'extra-8-band-sdk-dev' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra != 'extra-8-band-sdk-crewai' and extra != 'extra-8-band-sdk-dev-crewai')" }, { name = "shellingham" }, ] @@ -8168,7 +8699,7 @@ name = "types-jsonschema" version = "4.26.0.20260408" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "referencing" }, + { name = "referencing", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/4c/2ef5483ef81e7b6e1b901eb2994fd280cb19860134a20ff99e72748f3ccb/types_jsonschema-4.26.0.20260408.tar.gz", hash = "sha256:82b75a976ed1507c473b8dee2d4841bd65926758c6d672bb93d08bf5e16f1b3f", size = 16553, upload-time = "2026-04-08T04:36:00.543Z" } wheels = [ @@ -8210,7 +8741,7 @@ name = "tzlocal" version = "5.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "tzdata", marker = "sys_platform == 'win32' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ @@ -8375,8 +8906,8 @@ version = "21.14.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, - { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.12' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, - { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.12' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai')" }, + { name = "filelock", version = "3.32.7", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.14' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, + { name = "filelock", version = "4.0.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.14' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-dev-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-parlant') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-parlant' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-parlant' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, { name = "packaging" }, { name = "platformdirs" }, { name = "python-discovery" }, @@ -8418,7 +8949,7 @@ name = "watchfiles" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "anyio" }, + { name = "anyio", marker = "extra == 'extra-8-band-sdk-crewai' or extra == 'extra-8-band-sdk-dev-crewai' or extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } wheels = [ @@ -8622,7 +9153,7 @@ name = "werkzeug" version = "3.1.9" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "markupsafe" }, + { name = "markupsafe", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a4/34/4dd12fc8bb7d61c91467ec3efe415ffa7d5456f799954b40c5bbaeae470e/werkzeug-3.1.9.tar.gz", hash = "sha256:55ca7c70a75689be937aa27f8ff4b018f06ff4838fc73045560bf0f5a1291060", size = 940188, upload-time = "2026-09-27T18:33:41.637Z" } wheels = [ @@ -8693,7 +9224,7 @@ name = "wsproto" version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "h11" }, + { name = "h11", marker = "extra == 'extra-8-band-sdk-dev-parlant' or extra == 'extra-8-band-sdk-parlant' or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-dev') or (extra == 'extra-8-band-sdk-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-crewai') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-dev-strands-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-nooa') or (extra == 'extra-8-band-sdk-dev' and extra == 'extra-8-band-sdk-strands') or (extra == 'extra-8-band-sdk-dev-crewai' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-dev-strands-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-nooa' and extra == 'extra-8-band-sdk-pydantic-ai') or (extra == 'extra-8-band-sdk-pydantic-ai' and extra == 'extra-8-band-sdk-strands')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } wheels = [