diff --git a/examples/agent/langgraph-open-telemetry/pyproject.toml b/examples/agent/langgraph-open-telemetry/pyproject.toml index 955d7336..30773a46 100644 --- a/examples/agent/langgraph-open-telemetry/pyproject.toml +++ b/examples/agent/langgraph-open-telemetry/pyproject.toml @@ -9,7 +9,7 @@ dependencies = [ "langgraph-prebuilt>=0.6.0", "openai", "python-dotenv>=1.1.0", - "splunk-ao[otel]", + "splunk-ao", "opentelemetry-instrumentation-langchain>=0.48.1", "opentelemetry-instrumentation-openai-v2>=2.1b0", ] diff --git a/examples/agent/microsoft-agent-framework/requirements.txt b/examples/agent/microsoft-agent-framework/requirements.txt index 8d172f10..2c2af0bb 100644 --- a/examples/agent/microsoft-agent-framework/requirements.txt +++ b/examples/agent/microsoft-agent-framework/requirements.txt @@ -1,3 +1,3 @@ agent-framework>=1.0.0b251120 -splunk-ao[otel] +splunk-ao pydantic diff --git a/examples/agent/pydantic-ai-support-agent/pyproject.toml b/examples/agent/pydantic-ai-support-agent/pyproject.toml index 70f698ec..4d291be3 100644 --- a/examples/agent/pydantic-ai-support-agent/pyproject.toml +++ b/examples/agent/pydantic-ai-support-agent/pyproject.toml @@ -5,6 +5,6 @@ description = "An example project for using Splunk AO with PydanticAI." readme = "README.md" requires-python = ">=3.11, <3.14" dependencies = [ - "splunk-ao[otel]", + "splunk-ao", "pydantic-ai>=1.0.0", ] diff --git a/examples/logging-samples/distributed-tracing-otel-python-java/python-service/requirements.txt b/examples/logging-samples/distributed-tracing-otel-python-java/python-service/requirements.txt index 4d4600ec..fdfb2d8b 100644 --- a/examples/logging-samples/distributed-tracing-otel-python-java/python-service/requirements.txt +++ b/examples/logging-samples/distributed-tracing-otel-python-java/python-service/requirements.txt @@ -3,7 +3,7 @@ uvicorn==0.34.0 openai==1.82.0 langgraph==0.4.1 chromadb-client==0.6.3 -splunk-ao[otel] +splunk-ao opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http diff --git a/poetry.lock b/poetry.lock index 3fcb5eeb..0fc0f76c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7,7 +7,7 @@ description = "Happy Eyeballs for asyncio" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8"}, {file = "aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558"}, @@ -20,7 +20,7 @@ description = "Async http client/server framework (asyncio)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "aiohttp-3.13.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02222e7e233295f40e011c1b00e3b0bd451f22cf853a0304c3595633ee47da4b"}, {file = "aiohttp-3.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bace460460ed20614fa6bc8cb09966c0b8517b8c58ad8046828c6078d25333b5"}, @@ -163,7 +163,7 @@ description = "aiosignal: a list of registered asynchronous callbacks" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e"}, {file = "aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7"}, @@ -184,7 +184,7 @@ files = [ {file = "annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320"}, {file = "annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "annotated-types" @@ -225,7 +225,7 @@ description = "A small Python module for determining appropriate platform-specif optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -285,7 +285,7 @@ description = "Modern password hashing for your software and your servers" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "bcrypt-4.3.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f01e060f14b6b57bbb72fc5b4a83ac21c443c9a2ee708e04a10e9192f90a6281"}, {file = "bcrypt-4.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5eeac541cefd0bb887a371ef73c62c3cd78535e4887b310626036a7c0a817bb"}, @@ -351,7 +351,7 @@ description = "A simple, correct Python build frontend" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4"}, {file = "build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397"}, @@ -373,7 +373,7 @@ description = "Extensible memoizing collections and decorators" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"}, {file = "cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4"}, @@ -467,7 +467,7 @@ files = [ {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\") or platform_python_implementation != \"PyPy\" and python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or (extra == \"langchain\" or extra == \"all\") and platform_python_implementation == \"PyPy\" or (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\") or (extra == \"langchain\" or extra == \"all\") and python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")", test = "platform_python_implementation == \"PyPy\""} +markers = {main = "python_version <= \"3.13\" and platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\") or (extra == \"langchain\" or extra == \"all\") and platform_python_implementation == \"PyPy\" or python_version <= \"3.13\" and (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\")", test = "platform_python_implementation == \"PyPy\""} [package.dependencies] pycparser = "*" @@ -572,7 +572,6 @@ files = [ {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] -markers = {main = "python_version < \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\" or extra == \"otel\") or extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\" or python_version <= \"3.13\" and (extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\" or extra == \"crewai\")"} [[package]] name = "chromadb" @@ -581,7 +580,7 @@ description = "Chroma." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "chromadb-1.1.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:27fe0e25ef0f83fb09c30355ab084fe6f246808a7ea29e8c19e85cf45785b90d"}, {file = "chromadb-1.1.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:95aed58869683f12e7dcbf68b039fe5f576dbe9d1b86b8f4d014c9d077ccafd2"}, @@ -630,7 +629,7 @@ description = "Composable command line interface toolkit" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\") or python_version <= \"3.13\" and sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" +markers = "(extra == \"openai\" or extra == \"all\") and sys_platform != \"emscripten\" or python_version <= \"3.13\" and sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, @@ -650,7 +649,7 @@ files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or platform_system == \"Windows\") and (python_version <= \"3.13\" or platform_system == \"Windows\") and (os_name == \"nt\" or platform_system == \"Windows\" or sys_platform == \"win32\")", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", test = "sys_platform == \"win32\""} +markers = {main = "(python_version <= \"3.13\" or platform_system == \"Windows\") and (extra == \"crewai\" or extra == \"all\" or platform_system == \"Windows\") and (os_name == \"nt\" or platform_system == \"Windows\" or sys_platform == \"win32\")", dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", test = "sys_platform == \"win32\""} [[package]] name = "coloredlogs" @@ -659,7 +658,7 @@ description = "Colored terminal output for Python's logging module" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, @@ -779,7 +778,7 @@ description = "Cutting-edge framework for orchestrating role-playing, autonomous optional = true python-versions = "<3.14,>=3.10" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "crewai-1.6.1-py3-none-any.whl", hash = "sha256:8cec403ab89183bda28b830c722b6bc22457a2151a6aa46f07730e6fe7ab2723"}, {file = "crewai-1.6.1.tar.gz", hash = "sha256:b7d73a8a333abf71b30ab20c54086004cd0c016dfd86bba9c035ad5eb31e22a7"}, @@ -837,7 +836,7 @@ description = "cryptography is a package which provides cryptographic recipes an optional = true python-versions = "!=3.9.0,!=3.9.1,>=3.7" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74"}, {file = "cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f"}, @@ -914,7 +913,7 @@ files = [ {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or extra == \"openai\") and python_version <= \"3.13\" or extra == \"openai\" or extra == \"all\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"openai\") or extra == \"openai\" or extra == \"all\""} [[package]] name = "docstring-parser" @@ -927,7 +926,7 @@ files = [ {file = "docstring_parser-0.17.0-py3-none-any.whl", hash = "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708"}, {file = "docstring_parser-0.17.0.tar.gz", hash = "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.extras] dev = ["pre-commit (>=2.16.0) ; python_version >= \"3.9\"", "pydoctor (>=25.4.0)", "pytest"] @@ -941,7 +940,7 @@ description = "Module for converting between datetime.timedelta and Go's Duratio optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "durationpy-0.10-py3-none-any.whl", hash = "sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286"}, {file = "durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba"}, @@ -954,7 +953,7 @@ description = "An implementation of lxml.xmlfile for the standard library" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa"}, {file = "et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54"}, @@ -1003,7 +1002,7 @@ description = "Python bindings to Rust's UUID library." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a"}, {file = "fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00"}, @@ -1096,7 +1095,7 @@ files = [ {file = "filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de"}, {file = "filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.extras] docs = ["furo (>=2024.8.6)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] @@ -1110,7 +1109,7 @@ description = "The FlatBuffers serialization format for Python" optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "flatbuffers-25.2.10-py2.py3-none-any.whl", hash = "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051"}, {file = "flatbuffers-25.2.10.tar.gz", hash = "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e"}, @@ -1123,7 +1122,7 @@ description = "A list-like structure which implements collections.abc.MutableSeq optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a"}, {file = "frozenlist-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61"}, @@ -1238,7 +1237,7 @@ description = "File-system specification" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21"}, {file = "fsspec-2025.7.0.tar.gz", hash = "sha256:786120687ffa54b8283d942929540d8bc5ccfa820deb555a2b5d0ed2b737bf58"}, @@ -1304,7 +1303,7 @@ description = "Google Authentication Library" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca"}, {file = "google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77"}, @@ -1329,10 +1328,9 @@ urllib3 = ["packaging", "urllib3"] name = "googleapis-common-protos" version = "1.70.0" description = "Common protobufs used in Google APIs" -optional = true +optional = false python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8"}, {file = "googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257"}, @@ -1367,7 +1365,7 @@ description = "HTTP/2-based RPC framework" optional = true python-versions = ">=3.10" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "grpcio-1.81.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:6f9a0c9c1cc15c112d1c053064fd032b64917062292c3d70aea280e02ae10b77"}, {file = "grpcio-1.81.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:69ef28e54fc85397f91b8c19592b8ef3d81952080366914823bd8572a2958120"}, @@ -1447,7 +1445,7 @@ description = "Fast transfer of large files with the Hugging Face Hub." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and (platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\") and (platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"arm64\" or platform_machine == \"aarch64\")" files = [ {file = "hf_xet-1.1.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:60dae4b44d520819e54e216a2505685248ec0adbdb2dd4848b17aa85a0375cde"}, {file = "hf_xet-1.1.7-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:b109f4c11e01c057fc82004c9e51e6cdfe2cb230637644ade40c599739067b2e"}, @@ -1491,7 +1489,7 @@ description = "A collection of framework independent HTTP protocol utils." optional = true python-versions = ">=3.8.0" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "httptools-0.6.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3c73ce323711a6ffb0d247dcd5a550b8babf0f757e86a52558fe5b86d6fefcc0"}, {file = "httptools-0.6.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345c288418f0944a6fe67be8e6afa9262b18c7626c3ef3c28adc5eabc06a68da"}, @@ -1573,7 +1571,7 @@ description = "Consume Server-Sent Event (SSE) messages with HTTPX." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "httpx_sse-0.4.1-py3-none-any.whl", hash = "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37"}, {file = "httpx_sse-0.4.1.tar.gz", hash = "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e"}, @@ -1586,7 +1584,7 @@ description = "Client library to download and publish models, datasets and other optional = true python-versions = ">=3.8.0" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "huggingface_hub-0.34.4-py3-none-any.whl", hash = "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a"}, {file = "huggingface_hub-0.34.4.tar.gz", hash = "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c"}, @@ -1626,7 +1624,7 @@ description = "Human friendly output for text interfaces using Python" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, @@ -1669,10 +1667,9 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 name = "importlib-metadata" version = "8.7.0" description = "Read metadata from Python packages" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, @@ -1697,7 +1694,7 @@ description = "Read resources from Python packages" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec"}, {file = "importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c"}, @@ -1730,7 +1727,7 @@ description = "structured outputs for llm" optional = true python-versions = "<4.0,>=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "instructor-1.15.1-py3-none-any.whl", hash = "sha256:be81d17ba2b154a04ab4720808f24f9d6b598f80992f82eaf9cc79006099cf6c"}, {file = "instructor-1.15.1.tar.gz", hash = "sha256:c72406469d9025b742e83cf0c13e914b317db2089d08d889944e74fcd659ef94"}, @@ -1797,7 +1794,7 @@ files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.dependencies] MarkupSafe = ">=2.0" @@ -1891,7 +1888,7 @@ files = [ {file = "jiter-0.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9"}, {file = "jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or extra == \"openai\") and python_version <= \"3.13\" or extra == \"openai\" or extra == \"all\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"openai\") or extra == \"openai\" or extra == \"all\""} [[package]] name = "json-repair" @@ -1900,7 +1897,7 @@ description = "A package to repair broken json strings" optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "json_repair-0.25.2-py3-none-any.whl", hash = "sha256:51d67295c3184b6c41a3572689661c6128cef6cfc9fb04db63130709adfc5bf0"}, {file = "json_repair-0.25.2.tar.gz", hash = "sha256:161a56d7e6bbfd4cad3a614087e3e0dbd0e10d402dd20dc7db418432428cb32b"}, @@ -1913,7 +1910,7 @@ description = "A Python implementation of the JSON5 data format." optional = true python-versions = ">=3.8.0" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "json5-0.12.1-py3-none-any.whl", hash = "sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5"}, {file = "json5-0.12.1.tar.gz", hash = "sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990"}, @@ -1958,7 +1955,7 @@ description = "jsonref is a library for automatic dereferencing of JSON Referenc optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9"}, {file = "jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552"}, @@ -1971,7 +1968,7 @@ description = "An implementation of JSON Schema validation for Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, @@ -1994,7 +1991,7 @@ description = "The JSON Schema meta-schemas and vocabularies, exposed as a Regis optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, @@ -2010,7 +2007,7 @@ description = "Kubernetes python client" optional = true python-versions = ">=3.6" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "kubernetes-33.1.0-py2.py3-none-any.whl", hash = "sha256:544de42b24b64287f7e0aa9513c93cb503f7f40eea39b20f66810011a86eabc5"}, {file = "kubernetes-33.1.0.tar.gz", hash = "sha256:f64d829843a54c251061a8e7a14523b521f2dc5c896cf6d65ccf348648a88993"}, @@ -2199,7 +2196,7 @@ description = "Library to easily interface with LLM API providers" optional = true python-versions = "<3.14,>=3.10" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "litellm-1.86.1-py3-none-any.whl", hash = "sha256:54e52372d326c642e9cc76d39afffb9b22387cbff3694c5e2758c9f860bca2e9"}, {file = "litellm-1.86.1.tar.gz", hash = "sha256:616100384073f2ddec1a5391b34c806c7c99e6af4511741434809caa46075e13"}, @@ -2242,7 +2239,7 @@ files = [ {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.dependencies] mdurl = ">=0.1,<1.0" @@ -2327,7 +2324,7 @@ files = [ {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "mcp" @@ -2336,7 +2333,7 @@ description = "Model Context Protocol SDK" optional = true python-versions = ">=3.10" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "mcp-1.27.0-py3-none-any.whl", hash = "sha256:5ce1fa81614958e267b21fb2aa34e0aea8e2c6ede60d52aba45fd47246b4d741"}, {file = "mcp-1.27.0.tar.gz", hash = "sha256:d3dc35a7eec0d458c1da4976a48f982097ddaab87e278c5511d5a4a56e852b83"}, @@ -2374,7 +2371,7 @@ files = [ {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "mmh3" @@ -2383,7 +2380,7 @@ description = "Python extension for MurmurHash (MurmurHash3), a set of fast and optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "mmh3-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:81c504ad11c588c8629536b032940f2a359dda3b6cbfd4ad8f74cb24dcd1b0bc"}, {file = "mmh3-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b898cecff57442724a0f52bf42c2de42de63083a91008fb452887e372f9c328"}, @@ -2523,7 +2520,7 @@ description = "Python library for arbitrary-precision floating-point arithmetic" optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"}, {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"}, @@ -2654,7 +2651,7 @@ files = [ {file = "multidict-6.6.4-py3-none-any.whl", hash = "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c"}, {file = "multidict-6.6.4.tar.gz", hash = "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "mypy" @@ -2747,7 +2744,7 @@ description = "Fundamental package for array computing in Python" optional = true python-versions = ">=3.10" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -2813,7 +2810,7 @@ description = "A generic, spec-compliant, thorough implementation of the OAuth r optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, @@ -2831,7 +2828,7 @@ description = "ONNX Runtime is a runtime accelerator for Machine Learning models optional = true python-versions = ">=3.10" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "onnxruntime-1.22.0-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:85d8826cc8054e4d6bf07f779dc742a363c39094015bdad6a08b3c18cfe0ba8c"}, {file = "onnxruntime-1.22.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:468c9502a12f6f49ec335c2febd22fdceecc1e4cc96dfc27e419ba237dff5aff"}, @@ -2872,7 +2869,7 @@ files = [ {file = "openai-2.32.0-py3-none-any.whl", hash = "sha256:4dcc9badeb4bf54ad0d187453742f290226d30150890b7890711bda4f32f192f"}, {file = "openai-2.32.0.tar.gz", hash = "sha256:c54b27a9e4cb8d51f0dd94972ffd1a04437efeb259a9e60d8922b8bd26fe55e0"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or extra == \"openai\") and python_version <= \"3.13\" or extra == \"openai\" or extra == \"all\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"openai\") or extra == \"openai\" or extra == \"all\""} [package.dependencies] anyio = ">=3.5.0,<5" @@ -2965,7 +2962,7 @@ description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2"}, {file = "openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050"}, @@ -2978,10 +2975,9 @@ et-xmlfile = "*" name = "opentelemetry-api" version = "1.38.0" description = "OpenTelemetry Python API" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_api-1.38.0-py3-none-any.whl", hash = "sha256:2891b0197f47124454ab9f0cf58f3be33faca394457ac3e09daba13ff50aa582"}, {file = "opentelemetry_api-1.38.0.tar.gz", hash = "sha256:f4c193b5e8acb0912b06ac5b16321908dd0843d75049c091487322284a3eea12"}, @@ -2991,31 +2987,13 @@ files = [ importlib-metadata = ">=6.0,<8.8.0" typing-extensions = ">=4.5.0" -[[package]] -name = "opentelemetry-exporter-otlp" -version = "1.38.0" -description = "OpenTelemetry Collector Exporters" -optional = true -python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"otel\" or extra == \"all\"" -files = [ - {file = "opentelemetry_exporter_otlp-1.38.0-py3-none-any.whl", hash = "sha256:bc6562cef229fac8887ed7109fc5abc52315f39d9c03fd487bb8b4ef8fbbc231"}, - {file = "opentelemetry_exporter_otlp-1.38.0.tar.gz", hash = "sha256:2f55acdd475e4136117eff20fbf1b9488b1b0b665ab64407516e1ac06f9c3f9d"}, -] - -[package.dependencies] -opentelemetry-exporter-otlp-proto-grpc = "1.38.0" -opentelemetry-exporter-otlp-proto-http = "1.38.0" - [[package]] name = "opentelemetry-exporter-otlp-proto-common" version = "1.38.0" description = "OpenTelemetry Protobuf encoding" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_exporter_otlp_proto_common-1.38.0-py3-none-any.whl", hash = "sha256:03cb76ab213300fe4f4c62b7d8f17d97fcfd21b89f0b5ce38ea156327ddda74a"}, {file = "opentelemetry_exporter_otlp_proto_common-1.38.0.tar.gz", hash = "sha256:e333278afab4695aa8114eeb7bf4e44e65c6607d54968271a249c180b2cb605c"}, @@ -3031,7 +3009,7 @@ description = "OpenTelemetry Collector Protobuf over gRPC Exporter" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "opentelemetry_exporter_otlp_proto_grpc-1.38.0-py3-none-any.whl", hash = "sha256:7c49fd9b4bd0dbe9ba13d91f764c2d20b0025649a6e4ac35792fb8d84d764bc7"}, {file = "opentelemetry_exporter_otlp_proto_grpc-1.38.0.tar.gz", hash = "sha256:2473935e9eac71f401de6101d37d6f3f0f1831db92b953c7dcc912536158ebd6"}, @@ -3053,10 +3031,9 @@ typing-extensions = ">=4.6.0" name = "opentelemetry-exporter-otlp-proto-http" version = "1.38.0" description = "OpenTelemetry Collector Protobuf over HTTP Exporter" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_exporter_otlp_proto_http-1.38.0-py3-none-any.whl", hash = "sha256:84b937305edfc563f08ec69b9cb2298be8188371217e867c1854d77198d0825b"}, {file = "opentelemetry_exporter_otlp_proto_http-1.38.0.tar.gz", hash = "sha256:f16bd44baf15cbe07633c5112ffc68229d0edbeac7b37610be0b2def4e21e90b"}, @@ -3075,10 +3052,9 @@ typing-extensions = ">=4.5.0" name = "opentelemetry-proto" version = "1.38.0" description = "OpenTelemetry Python Proto" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_proto-1.38.0-py3-none-any.whl", hash = "sha256:b6ebe54d3217c42e45462e2a1ae28c3e2bf2ec5a5645236a490f55f45f1a0a18"}, {file = "opentelemetry_proto-1.38.0.tar.gz", hash = "sha256:88b161e89d9d372ce723da289b7da74c3a8354a8e5359992be813942969ed468"}, @@ -3091,10 +3067,9 @@ protobuf = ">=5.0,<7.0" name = "opentelemetry-sdk" version = "1.38.0" description = "OpenTelemetry Python SDK" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_sdk-1.38.0-py3-none-any.whl", hash = "sha256:1c66af6564ecc1553d72d811a01df063ff097cdc82ce188da9951f93b8d10f6b"}, {file = "opentelemetry_sdk-1.38.0.tar.gz", hash = "sha256:93df5d4d871ed09cb4272305be4d996236eedb232253e3ab864c8620f051cebe"}, @@ -3109,10 +3084,9 @@ typing-extensions = ">=4.5.0" name = "opentelemetry-semantic-conventions" version = "0.59b0" description = "OpenTelemetry Semantic Conventions" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "opentelemetry_semantic_conventions-0.59b0-py3-none-any.whl", hash = "sha256:35d3b8833ef97d614136e253c1da9342b4c3c083bbaf29ce31d572a1c3825eed"}, {file = "opentelemetry_semantic_conventions-0.59b0.tar.gz", hash = "sha256:7a6db3f30d70202d5bf9fa4b69bc866ca6a30437287de6c510fb594878aed6b0"}, @@ -3214,7 +3188,7 @@ files = [ {file = "orjson-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c9ec0cc0d4308cad1e38a1ee23b64567e2ff364c2a3fe3d6cbc69cf911c45712"}, {file = "orjson-3.11.2.tar.gz", hash = "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309"}, ] -markers = {main = "extra == \"langchain\" or extra == \"all\" or (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") and python_version <= \"3.13\"", test = "platform_python_implementation != \"PyPy\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") or extra == \"langchain\" or extra == \"all\"", test = "platform_python_implementation != \"PyPy\""} [[package]] name = "ormsgpack" @@ -3282,7 +3256,7 @@ description = "A decorator to automatically detect mismatch when overriding a me optional = true python-versions = ">=3.6" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -3299,7 +3273,7 @@ files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] -markers = {main = "python_version < \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\") or extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or python_version <= \"3.13\" and (extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"crewai\")"} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\") or extra == \"langchain\" or extra == \"all\" or extra == \"openai\""} [[package]] name = "pathspec" @@ -3320,7 +3294,7 @@ description = "PDF parser and analyzer" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pdfminer_six-20250506-py3-none-any.whl", hash = "sha256:d81ad173f62e5f841b53a8ba63af1a4a355933cfc0ffabd608e568b9193909e3"}, {file = "pdfminer_six-20250506.tar.gz", hash = "sha256:b03cc8df09cf3c7aba8246deae52e0bca7ebb112a38895b5e1d4f5dd2b8ca2e7"}, @@ -3342,7 +3316,7 @@ description = "Plumb a PDF for detailed information about each char, rectangle, optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pdfplumber-0.11.7-py3-none-any.whl", hash = "sha256:edd2195cca68bd770da479cf528a737e362968ec2351e62a6c0b71ff612ac25e"}, {file = "pdfplumber-0.11.7.tar.gz", hash = "sha256:fa67773e5e599de1624255e9b75d1409297c5e1d7493b386ce63648637c67368"}, @@ -3360,7 +3334,7 @@ description = "Python Imaging Library (Fork)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, @@ -3519,7 +3493,7 @@ description = "Wraps the portalocker recipe for easy usage" optional = true python-versions = ">=3.5" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "portalocker-2.7.0-py2.py3-none-any.whl", hash = "sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983"}, {file = "portalocker-2.7.0.tar.gz", hash = "sha256:032e81d534a88ec1736d03f780ba073f047a06c478b06e2937486f334e955c51"}, @@ -3540,7 +3514,7 @@ description = "Integrate PostHog into any python application." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "posthog-5.4.0-py3-none-any.whl", hash = "sha256:284dfa302f64353484420b52d4ad81ff5c2c2d1d607c4e2db602ac72761831bd"}, {file = "posthog-5.4.0.tar.gz", hash = "sha256:701669261b8d07cdde0276e5bc096b87f9e200e3b9589c5ebff14df658c5893c"}, @@ -3684,16 +3658,15 @@ files = [ {file = "propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f"}, {file = "propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "protobuf" version = "6.31.1" description = "" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9"}, {file = "protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447"}, @@ -3713,7 +3686,7 @@ description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, @@ -3726,7 +3699,7 @@ description = "A collection of ASN.1-based protocols modules" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a"}, {file = "pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6"}, @@ -3742,7 +3715,7 @@ description = "Fast Base64 encoding/decoding" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pybase64-1.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82b4593b480773b17698fef33c68bae0e1c474ba07663fad74249370c46b46c9"}, {file = "pybase64-1.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a126f29d29cb4a498db179135dbf955442a0de5b00f374523f5dcceb9074ff58"}, @@ -3965,7 +3938,7 @@ files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\") or platform_python_implementation != \"PyPy\" and python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or (extra == \"langchain\" or extra == \"all\") and platform_python_implementation == \"PyPy\" or (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\") or (extra == \"langchain\" or extra == \"all\") and python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")", test = "platform_python_implementation == \"PyPy\""} +markers = {main = "python_version <= \"3.13\" and platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or platform_python_implementation != \"PyPy\" and (extra == \"openai\" or extra == \"all\") or (extra == \"langchain\" or extra == \"all\") and platform_python_implementation == \"PyPy\" or python_version <= \"3.13\" and (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or (extra == \"langchain\" or extra == \"all\") and (extra == \"openai\" or extra == \"all\")", test = "platform_python_implementation == \"PyPy\""} [[package]] name = "pydantic" @@ -4173,7 +4146,7 @@ files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.extras] windows-terminal = ["colorama (>=0.4.6)"] @@ -4206,7 +4179,7 @@ description = "Python bindings to PDFium" optional = true python-versions = ">=3.6" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pypdfium2-4.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab"}, {file = "pypdfium2-4.30.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4e55689f4b06e2d2406203e771f78789bd4f190731b5d57383d05cf611d829de"}, @@ -4230,7 +4203,7 @@ description = "A SQL query builder API for Python" optional = true python-versions = "*" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "PyPika-0.48.9.tar.gz", hash = "sha256:838836a61747e7c8380cd1b7ff638694b7a7335345d0f559b04b2cd832ad5378"}, ] @@ -4242,7 +4215,7 @@ description = "Wrappers to call pyproject.toml-based build backend hooks." optional = true python-versions = ">=3.7" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913"}, {file = "pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8"}, @@ -4255,7 +4228,7 @@ description = "A python implementation of GNU readline." optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and sys_platform == \"win32\" and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\") and sys_platform == \"win32\"" files = [ {file = "pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6"}, {file = "pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7"}, @@ -4451,7 +4424,7 @@ description = "A streaming multipart parser for Python" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, @@ -4464,7 +4437,7 @@ description = "Python for Window Extensions" optional = true python-versions = "*" groups = ["main"] -markers = "sys_platform == \"win32\" and python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or sys_platform == \"win32\" and (extra == \"openai\" or extra == \"all\") or python_version <= \"3.13\" and platform_system == \"Windows\" and (extra == \"crewai\" or extra == \"all\")" +markers = "(extra == \"openai\" or extra == \"all\") and sys_platform == \"win32\" or python_version <= \"3.13\" and sys_platform == \"win32\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\") and platform_system == \"Windows\"" files = [ {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, @@ -4550,7 +4523,7 @@ files = [ {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") and python_version <= \"3.13\" or extra == \"langchain\" or extra == \"all\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") or extra == \"langchain\" or extra == \"all\""} [[package]] name = "referencing" @@ -4559,7 +4532,7 @@ description = "JSON Referencing + Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -4577,7 +4550,7 @@ description = "Alternative regular expression module, to replace re." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d856164d25e2b3b07b779bfed813eb4b6b6ce73c2fd818d46f47c1eb5cd79bd6"}, {file = "regex-2025.7.34-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d15a9da5fad793e35fb7be74eec450d968e05d2e294f3e0e77ab03fa7234a83"}, @@ -4679,7 +4652,6 @@ files = [ {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] -markers = {main = "python_version < \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\" or extra == \"otel\") or extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\" or python_version <= \"3.13\" and (extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\" or extra == \"crewai\")"} [package.dependencies] certifi = ">=2017.4.17" @@ -4716,7 +4688,7 @@ description = "OAuthlib authentication support for Requests." optional = true python-versions = ">=3.4" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, @@ -4771,7 +4743,7 @@ files = [ {file = "rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f"}, {file = "rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.dependencies] markdown-it-py = ">=2.2.0" @@ -4787,7 +4759,7 @@ description = "Python bindings to Rust's persistent data structures (rpds)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "rpds_py-0.27.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4"}, {file = "rpds_py-0.27.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4"}, @@ -4953,7 +4925,7 @@ description = "Pure-Python RSA implementation" optional = true python-versions = "<4,>=3.6" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762"}, {file = "rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75"}, @@ -5077,7 +5049,7 @@ files = [ {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [[package]] name = "six" @@ -5110,7 +5082,7 @@ description = "SSE plugin for Starlette" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "extra == \"openai\" or extra == \"all\" or (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") and python_version <= \"3.13\"" +markers = "extra == \"openai\" or extra == \"all\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\")" files = [ {file = "sse_starlette-3.0.2-py3-none-any.whl", hash = "sha256:16b7cbfddbcd4eaca11f7b586f3b8a080f1afe952c15813455b162edea619e5a"}, {file = "sse_starlette-3.0.2.tar.gz", hash = "sha256:ccd60b5765ebb3584d0de2d7a6e4f745672581de4f5005ab31c3a25d10b52b3a"}, @@ -5136,7 +5108,7 @@ files = [ {file = "starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35"}, {file = "starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5"}, ] -markers = {main = "python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\" or extra == \"middleware\") or extra == \"openai\" or extra == \"all\" or extra == \"middleware\""} +markers = {main = "extra == \"openai\" or extra == \"all\" or extra == \"middleware\" or python_version <= \"3.13\" and (extra == \"openai\" or extra == \"all\" or extra == \"middleware\" or extra == \"crewai\")"} [package.dependencies] anyio = ">=3.6.2,<5" @@ -5151,7 +5123,7 @@ description = "Computer algebra system (CAS) in Python" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5"}, {file = "sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517"}, @@ -5174,7 +5146,7 @@ files = [ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"}, {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") and python_version <= \"3.13\" or extra == \"langchain\" or extra == \"all\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\") or extra == \"langchain\" or extra == \"all\""} [package.extras] doc = ["reno", "sphinx"] @@ -5202,7 +5174,7 @@ description = "tiktoken is a fast BPE tokeniser for use with OpenAI's models" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "tiktoken-0.11.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8a9b517d6331d7103f8bef29ef93b3cca95fa766e293147fe7bacddf310d5917"}, {file = "tiktoken-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b4ddb1849e6bf0afa6cc1c5d809fb980ca240a5fffe585a04e119519758788c0"}, @@ -5356,7 +5328,7 @@ description = "" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "tokenizers-0.21.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133"}, {file = "tokenizers-0.21.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60"}, @@ -5390,7 +5362,7 @@ description = "A lil' TOML parser" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, @@ -5433,7 +5405,7 @@ description = "A lil' TOML writer" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90"}, {file = "tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021"}, @@ -5484,7 +5456,7 @@ files = [ {file = "typer-0.26.8-py3-none-any.whl", hash = "sha256:3512ca79ac5c11113414b36e80281b872884477722440691c89d1112e321a49c"}, {file = "typer-0.26.8.tar.gz", hash = "sha256:c244a6bd558886fe3f8780efb6bdd28bb9aff005a94eedebaa5cb32926fe2f7e"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.dependencies] annotated-doc = ">=0.0.2" @@ -5571,11 +5543,11 @@ description = "HTTP library with thread-safe connection pooling, file post, and optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" groups = ["main", "test"] +markers = "platform_python_implementation == \"PyPy\"" files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] -markers = {main = "platform_python_implementation == \"PyPy\" and (extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\") or platform_python_implementation == \"PyPy\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\" or extra == \"otel\") and python_version <= \"3.13\"", test = "platform_python_implementation == \"PyPy\""} [package.extras] brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] @@ -5589,11 +5561,11 @@ description = "HTTP library with thread-safe connection pooling, file post, and optional = false python-versions = ">=3.9" groups = ["main", "test"] +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, ] -markers = {main = "platform_python_implementation != \"PyPy\" and (extra == \"langchain\" or extra == \"all\" or extra == \"openai\" or extra == \"otel\") or platform_python_implementation != \"PyPy\" and (extra == \"crewai\" or extra == \"all\" or extra == \"langchain\" or extra == \"openai\" or extra == \"otel\") and python_version <= \"3.13\"", test = "platform_python_implementation != \"PyPy\""} [package.extras] brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] @@ -5641,7 +5613,7 @@ description = "An extremely fast Python package and project manager, written in optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "uv-0.8.9-py3-none-linux_armv6l.whl", hash = "sha256:4633c693c79c57a77c52608cbca8a6bb17801bfa223326fbc5c5142654c23cc3"}, {file = "uv-0.8.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:1cdc11cbc81824e51ebb1bac35745a79048557e869ef9da458e99f1c3a96c7f9"}, @@ -5671,7 +5643,7 @@ description = "The lightning-fast ASGI server." optional = true python-versions = ">=3.9" groups = ["main"] -markers = "sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\") or python_version <= \"3.13\" and sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" +markers = "(extra == \"openai\" or extra == \"all\") and sys_platform != \"emscripten\" or python_version <= \"3.13\" and sys_platform != \"emscripten\" and (extra == \"openai\" or extra == \"all\" or extra == \"crewai\") or python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"}, {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"}, @@ -5796,7 +5768,7 @@ description = "Simple, modern and high performance file watching and code reload optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "watchfiles-1.1.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:27f30e14aa1c1e91cb653f03a63445739919aef84c8d2517997a83155e7a2fcc"}, {file = "watchfiles-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3366f56c272232860ab45c77c3ca7b74ee819c8e1f6f35a7125556b198bbc6df"}, @@ -5916,7 +5888,7 @@ description = "WebSocket client for Python with low level API options" optional = true python-versions = ">=3.8" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")" files = [ {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, @@ -5934,7 +5906,7 @@ description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = true python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"openai\") and python_version <= \"3.13\" or extra == \"openai\" or extra == \"all\"" +markers = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\" or extra == \"openai\") or extra == \"openai\" or extra == \"all\"" files = [ {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b"}, {file = "websockets-15.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205"}, @@ -6374,7 +6346,7 @@ files = [ {file = "yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77"}, {file = "yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac"}, ] -markers = {main = "(extra == \"crewai\" or extra == \"all\") and python_version <= \"3.13\""} +markers = {main = "python_version <= \"3.13\" and (extra == \"crewai\" or extra == \"all\")"} [package.dependencies] idna = ">=2.0" @@ -6406,10 +6378,9 @@ tests = ["build", "coverage", "mypy", "ruff", "wheel"] name = "zipp" version = "3.23.0" description = "Backport of pathlib-compatible object wrapper for zip files" -optional = true +optional = false python-versions = ">=3.9" groups = ["main"] -markers = "(extra == \"crewai\" or extra == \"all\" or extra == \"otel\") and python_version <= \"3.13\" or extra == \"otel\" or extra == \"all\"" files = [ {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, @@ -6538,14 +6509,13 @@ cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\ cffi = ["cffi (>=1.11)"] [extras] -all = ["crewai", "grpcio", "langchain", "langchain-core", "litellm", "openai", "openai-agents", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk", "packaging", "starlette"] +all = ["crewai", "langchain", "langchain-core", "litellm", "openai", "openai-agents", "packaging", "starlette"] crewai = ["crewai", "litellm"] langchain = ["langchain", "langchain-core"] middleware = ["starlette"] openai = ["openai", "openai-agents", "packaging"] -otel = ["grpcio", "opentelemetry-api", "opentelemetry-exporter-otlp", "opentelemetry-sdk"] [metadata] lock-version = "2.1" python-versions = "^3.11,<3.15" -content-hash = "f75a182570e1129b6b65927aac9d700eae02d507391e7d2d6850d8910e4d55bf" +content-hash = "fc15ac12d601438767f22ae077f22d9578fce72718dafbf8e589b84c0847bade" diff --git a/pyproject.toml b/pyproject.toml index fb68b278..492063d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,8 +24,7 @@ langchain = ["langchain-core", "langchain"] openai = ["openai (>=2.8.0,<3.0.0)", "packaging (>=24.2,<25.0)", "openai-agents (>=0.4.0,<1.0.0)"] crewai = ["crewai (>=0.152.0,<2.0.0); python_version < '3.14'", "litellm (>=1.83.14,<2.0.0); python_version < '3.14'"] middleware = ["starlette"] -otel = ["opentelemetry-sdk (>=1.38.0,<2.0.0)", "opentelemetry-api (>=1.38.0,<2.0.0)", "opentelemetry-exporter-otlp (>=1.38.0,<2.0.0)", "grpcio (>=1.80.0,<2.0.0)"] -all = ["langchain-core", "langchain", "openai (>=2.8.0,<3.0.0)", "packaging (>=24.2,<25.0)", "openai-agents (>=0.4.0,<1.0.0)", "opentelemetry-sdk (>=1.38.0,<2.0.0)", "opentelemetry-api (>=1.38.0,<2.0.0)", "opentelemetry-exporter-otlp (>=1.38.0,<2.0.0)", "grpcio (>=1.80.0,<2.0.0)", "crewai (>=0.152.0,<2.0.0); python_version < '3.14'", "starlette", "litellm (>=1.83.14,<2.0.0); python_version < '3.14'"] +all = ["langchain-core", "langchain", "openai (>=2.8.0,<3.0.0)", "packaging (>=24.2,<25.0)", "openai-agents (>=0.4.0,<1.0.0)", "crewai (>=0.152.0,<2.0.0); python_version < '3.14'", "starlette", "litellm (>=1.83.14,<2.0.0); python_version < '3.14'"] @@ -47,13 +46,9 @@ backoff = "^2.2.1" crewai = { version = ">=0.152.0,<2.0.0", optional = true, python = ">=3.11,<3.14" } tqdm = { version = ">=4.0.0" } typing-extensions = { version = ">=4.5.0" } -opentelemetry-sdk = { version = "^1.38.0", optional = true } -opentelemetry-api = { version = "^1.38.0", optional = true } -opentelemetry-exporter-otlp = { version = "^1.38.0", optional = true } -# Explicit lower bound ensures pre-built cp314 wheels are available (1.80.0+). -# Without this, resolvers could pick grpcio<1.80.0 which has no cp314 wheels, -# forcing source compilation (~20 min) on Python 3.14 CI runners. -grpcio = { version = ">=1.80.0,<2.0.0", optional = true } +opentelemetry-sdk = "^1.38.0" +opentelemetry-api = "^1.38.0" +opentelemetry-exporter-otlp-proto-http = "^1.38.0" [tool.poetry.group.test.dependencies] pytest = "^8.4.0" diff --git a/splunk-ao-a2a/pyproject.toml b/splunk-ao-a2a/pyproject.toml index f80934bc..e71e6cca 100644 --- a/splunk-ao-a2a/pyproject.toml +++ b/splunk-ao-a2a/pyproject.toml @@ -37,7 +37,7 @@ dev = [ "ruff>=0.12.3", "mypy>=1.16.0", "opentelemetry-instrumentation>=0.61b0", - "splunk-ao[otel]>=0.1.0,<1.0.0", + "splunk-ao>=0.1.0,<1.0.0", ] examples = [ "uvicorn>=0.42.0", diff --git a/splunk-ao-adk/pyproject.toml b/splunk-ao-adk/pyproject.toml index 96e46476..09077b69 100644 --- a/splunk-ao-adk/pyproject.toml +++ b/splunk-ao-adk/pyproject.toml @@ -136,7 +136,7 @@ dev = [ "ruff>=0.12.3", "mypy>=1.16.0", "coverage>=7.9.2", - "splunk-ao[otel]>=0.1.0,<1.0.0", + "splunk-ao>=0.1.0,<1.0.0", "galileo-core[testing]>=3.82.0", ] diff --git a/src/splunk_ao/logger/logger.py b/src/splunk_ao/logger/logger.py index 5879c938..1134e569 100644 --- a/src/splunk_ao/logger/logger.py +++ b/src/splunk_ao/logger/logger.py @@ -9,6 +9,8 @@ import time import uuid from collections.abc import Callable +from contextvars import ContextVar, Token +from dataclasses import dataclass from datetime import datetime from typing import TYPE_CHECKING, Any, Union @@ -17,6 +19,11 @@ import backoff import httpx +from opentelemetry import context as otel_context +from opentelemetry import trace as otel_trace +from opentelemetry.sdk.trace.id_generator import RandomIdGenerator +from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags, TraceState +from pydantic import PrivateAttr from galileo_core.helpers.execution import async_run from galileo_core.schemas.logging.agent import AgentType @@ -109,6 +116,36 @@ # Cached result of the ingest service healthz probe. Key "result" is absent until first check. _ingest_service_cache: dict[str, bool] = {} _logger = logging.getLogger("splunk_ao.logger") +_otel_id_generator = RandomIdGenerator() + + +@dataclass(frozen=True) +class OtelIds: + """Stable OTel identity and parentage for one proprietary logger step.""" + + span_context: SpanContext + parent_span_context: SpanContext | None + + +@dataclass(frozen=True) +class ActiveOtelContext: + """An attached OTel context for one genuinely open managed step.""" + + logger_id: int + step_id: uuid.UUID + span_context: SpanContext + token: Token + + +@dataclass(frozen=True) +class OtelContextState: + """Request-local state for all active proprietary logger contexts.""" + + base_context: otel_context.Context + active_contexts: tuple[ActiveOtelContext, ...] + + +_otel_context_state: ContextVar[OtelContextState | None] = ContextVar("_otel_context_state", default=None) class SplunkAOLogger(TracesLogger): @@ -189,6 +226,7 @@ class SplunkAOLogger(TracesLogger): _traces_client: Union["Traces", "IngestTraces"] | None = None _task_handler: ThreadPoolTaskHandler _trace_completion_submitted: bool + _otel_ids: dict[uuid.UUID, OtelIds] = PrivateAttr(default_factory=dict) def __init__( self, @@ -354,6 +392,170 @@ def __init__( atexit.register(self.terminate) self._auto_enable_agent_control_if_available() + def _set_current_parent(self, parent: StepWithChildSpans | None) -> None: + """Set the proprietary parent and mirror its open chain in OTel context.""" + super()._set_current_parent(parent) + self._sync_otel_context(parent) + + def reset_parent_tracking(self) -> None: + """Clear proprietary and OTel tracking for the current request context.""" + current_parent = self.current_parent() + root = current_parent + while root is not None and root._parent is not None: + root = root._parent + + self._set_current_parent(None) + if root is not None: + self._discard_otel_subtree(root) + + def _assign_otel_context( + self, otel_trace_id: int, parent_span_context: SpanContext | None, trace_state: TraceState + ) -> SpanContext: + """Create a sampled local SpanContext without changing the active context.""" + return SpanContext( + trace_id=otel_trace_id, + span_id=_otel_id_generator.generate_span_id(), + is_remote=False, + trace_flags=TraceFlags(TraceFlags.SAMPLED), + trace_state=trace_state, + ) + + def _record_otel_ids( + self, step: BaseStep, parent_step: BaseStep | None = None, parent_span_context: SpanContext | None = None + ) -> OtelIds: + """Assign stable OTel identity using the step's actual Galileo parent.""" + if parent_step is not None: + parent_ids = self._otel_ids.get(parent_step.id) + if parent_ids is None: + raise RuntimeError(f"Missing OTel context for parent step {parent_step.id}.") + parent_span_context = parent_ids.span_context + elif parent_span_context is None: + active_context = otel_trace.get_current_span().get_span_context() + parent_span_context = active_context if active_context.is_valid else None + + if parent_span_context is None: + otel_trace_id = _otel_id_generator.generate_trace_id() + trace_state = TraceState() + else: + otel_trace_id = parent_span_context.trace_id + trace_state = parent_span_context.trace_state + + ids = OtelIds( + span_context=self._assign_otel_context(otel_trace_id, parent_span_context, trace_state), + parent_span_context=parent_span_context, + ) + self._otel_ids[step.id] = ids + return ids + + def _open_otel_step_ids(self, current_parent: StepWithChildSpans | None) -> tuple[uuid.UUID, ...]: + """Return the root-to-current proprietary chain that has OTel identities.""" + path: list[uuid.UUID] = [] + current = current_parent + while current is not None: + if current.id in self._otel_ids: + path.append(current.id) + current = current._parent + return tuple(reversed(path)) + + def _sync_otel_context(self, current_parent: StepWithChildSpans | None) -> None: + """Reconcile this logger's open chain with request-local OTel context.""" + desired_step_ids = self._open_otel_step_ids(current_parent) + logger_id = id(self) + state = _otel_context_state.get() + active_contexts = state.active_contexts if state is not None else () + logger_contexts = tuple(active for active in active_contexts if active.logger_id == logger_id) + + if not desired_step_ids and not logger_contexts: + return + + logger_is_current = ( + bool(desired_step_ids) + and len(active_contexts) >= len(desired_step_ids) + and all( + active.logger_id == logger_id and active.step_id == step_id + for active, step_id in zip(active_contexts[-len(desired_step_ids) :], desired_step_ids, strict=True) + ) + ) + if desired_step_ids and logger_is_current: + current_span_context = otel_trace.get_current_span().get_span_context() + if current_span_context == self._otel_ids[desired_step_ids[-1]].span_context: + return + + base_context = state.base_context if state is not None else otel_context.get_current() + remaining_contexts = tuple(active for active in active_contexts if active.logger_id != logger_id) + desired_contexts = tuple( + (logger_id, step_id, self._otel_ids[step_id].span_context) for step_id in desired_step_ids + ) + contexts_to_restore = ( + tuple((active.logger_id, active.step_id, active.span_context) for active in remaining_contexts) + + desired_contexts + ) + + detach_failed = False + for active in reversed(active_contexts): + try: + active.token.var.reset(active.token) + except (RuntimeError, ValueError): + # ContextVar tokens cannot be reset from a copied execution + # context. Restore the recorded base before rebuilding below. + detach_failed = True + + if detach_failed: + otel_context.attach(base_context) + + rebuilt_contexts: list[ActiveOtelContext] = [] + for owner_id, step_id, span_context in contexts_to_restore: + ctx = otel_trace.set_span_in_context(NonRecordingSpan(span_context)) + rebuilt_contexts.append( + ActiveOtelContext( + logger_id=owner_id, step_id=step_id, span_context=span_context, token=otel_context.attach(ctx) + ) + ) + + if rebuilt_contexts: + _otel_context_state.set( + OtelContextState(base_context=base_context, active_contexts=tuple(rebuilt_contexts)) + ) + else: + _otel_context_state.set(None) + + def _discard_otel_subtree(self, step: BaseStep) -> None: + """Remove stable identities for a completed proprietary subtree.""" + self._discard_otel_identity_tree(step.id) + + def _discard_otel_identity_tree(self, step_id: uuid.UUID) -> None: + """Remove one identity and all identities parented to it.""" + ids = self._otel_ids.pop(step_id, None) + if ids is None: + return + + child_ids = tuple( + child_id + for child_id, child_ids in self._otel_ids.items() + if child_ids.parent_span_context == ids.span_context + ) + for child_id in child_ids: + self._discard_otel_identity_tree(child_id) + + def _release_otel_context(self, finished_step: BaseStep) -> None: + """Release identity bookkeeping after active context has moved upward.""" + self._discard_otel_subtree(finished_step) + + def _current_span_id(self) -> uuid.UUID: + """Return the current proprietary parent ID for internal lifecycle tests.""" + current_parent = self.current_parent() + if current_parent is None: + raise ValueError("No active trace or span.") + return current_parent.id + + @staticmethod + def _current_otel_span_id() -> int: + """Return the active OTel span ID.""" + span_context = otel_trace.get_current_span().get_span_context() + if not span_context.is_valid: + raise ValueError("No active OTel span.") + return span_context.span_id + def _auto_enable_agent_control_if_available(self) -> None: """Best-effort Agent Control bridge registration for optional installs.""" try: @@ -481,6 +683,7 @@ def _init_distributed_trace_stubs(self) -> None: # Set trace as current parent using parent pointers stub_trace._parent = None # Root trace has no parent + self._record_otel_ids(stub_trace) self._set_current_parent(stub_trace) if self.span_id: @@ -494,6 +697,7 @@ def _init_distributed_trace_stubs(self) -> None: ) # Set parent pointer and update current parent stub_span._parent = stub_trace + self._record_otel_ids(stub_span, parent_step=stub_trace) self._set_current_parent(stub_span) def add_trace( @@ -534,6 +738,8 @@ def add_trace( trace._parent = None self.traces.append(trace) self._set_current_parent(trace) + self._record_otel_ids(trace) + self._sync_otel_context(trace) return trace @staticmethod @@ -1260,12 +1466,15 @@ def add_single_llm_span_trace( ) ) self.traces.append(trace) + self._record_otel_ids(trace) + self._record_otel_ids(trace.spans[0], parent_step=trace) self._set_current_parent(None) if self.mode == "distributed": self.traces = [trace] self._ingest_step_streaming(trace, is_complete=False) + self._release_otel_context(trace) return trace @nop_sync @@ -1374,6 +1583,7 @@ def add_llm_span( if metadata: metadata = {k: SplunkAOLogger._convert_metadata_value(v) for k, v in metadata.items()} + parent = self.current_parent() span = LoggedLlmSpan( input=input, redacted_input=redacted_input, @@ -1399,6 +1609,7 @@ def add_llm_span( step_number=step_number, ) self.add_child_span_to_parent(span) + self._record_otel_ids(span, parent_step=parent) if self.mode == "distributed": self._ingest_step_streaming(span) @@ -1480,7 +1691,9 @@ def add_retriever_span( "step_number": step_number, "id": uuid.uuid4(), } + parent = self.current_parent() span = super().add_retriever_span(**kwargs) + self._record_otel_ids(span, parent_step=parent) if self.mode == "distributed": self._ingest_step_streaming(span) @@ -1569,7 +1782,9 @@ def add_tool_span( "step_number": step_number, "id": uuid.uuid4(), } + parent = self.current_parent() span = super().add_tool_span(**kwargs) + self._record_otel_ids(span, parent_step=parent) if self.mode == "distributed": self._ingest_step_streaming(span) @@ -1580,6 +1795,7 @@ def _attach_parentable_span(self, span: StepWithChildSpans, status_code: int | N parent = self.current_parent() span._parent = parent self.add_child_span_to_parent(span) + self._record_otel_ids(span, parent_step=parent) self._set_current_parent(span) if status_code is not None: span.status_code = status_code @@ -1829,6 +2045,7 @@ def add_control_span( span = LoggedControlSpan(**span_kwargs) span._parent = current_parent self.add_child_span_to_parent(span) + self._record_otel_ids(span, parent_step=current_parent) if self.mode == "distributed": self._ingest_step_streaming(span) @@ -1915,6 +2132,7 @@ def conclude( finished_step, current_parent = self._conclude( output=output, redacted_output=redacted_output, duration_ns=duration_ns, status_code=status_code ) + self._release_otel_context(finished_step) if self.mode == "distributed": # In distributed mode, conclude() marks the trace as complete immediately # Batch mode keeps traces in memory and sends them all during flush() @@ -1930,6 +2148,7 @@ def conclude( finished_step, current_parent = self._conclude( output=output, redacted_output=redacted_output, duration_ns=duration_ns, status_code=status_code ) + self._release_otel_context(finished_step) if self.mode == "distributed": # Mark each concluded trace/span as complete self._update_step_streaming(finished_step, is_complete=True) @@ -1963,6 +2182,7 @@ def flush(self, on_error: Callable[[Exception], None] | None = None) -> list[Log # Reset parent tracking in the main thread (async_run uses thread pool). # Using finally ensures cleanup even if ingestion fails. self._set_current_parent(None) + self._otel_ids.clear() except Exception as e: if on_error is not None: # Guard the callback so a buggy on_error never crashes the caller. @@ -1996,6 +2216,7 @@ async def async_flush(self) -> list[LoggedTrace]: finally: # Reset parent tracking. Using finally ensures cleanup even if ingestion fails. self._set_current_parent(None) + self._otel_ids.clear() @async_warn_catch_exception(exceptions=(Exception,)) async def _wait_for_all_tasks_async(self, timeout_seconds: int) -> None: @@ -2205,6 +2426,7 @@ def terminate(self) -> None: self._wait_for_all_tasks_sync(timeout_seconds=terminate_timeout_seconds) self.traces = [] self._set_current_parent(None) + self._otel_ids.clear() else: # Batch mode: try flush() but don't fail if async_run has issues during shutdown try: diff --git a/src/splunk_ao/otel.py b/src/splunk_ao/otel.py index f60f32ee..69a4eb7e 100644 --- a/src/splunk_ao/otel.py +++ b/src/splunk_ao/otel.py @@ -28,8 +28,8 @@ INSTALL_ERR_MSG = ( - "OpenTelemetry packages are not installed. " - "Install optional OpenTelemetry dependencies with: pip install galileo[otel]" + "OpenTelemetry packages required by splunk-ao are not installed. " + "Reinstall splunk-ao to restore its required dependencies." ) @@ -235,10 +235,7 @@ def __init__( When OpenTelemetry dependencies are not installed. """ if not OTEL_AVAILABLE: - raise ImportError( - "OpenTelemetry packages are not installed. " - "Install optional OpenTelemetry dependencies with: pip install galileo[otel]" - ) + raise ImportError(INSTALL_ERR_MSG) # Resolve project and logstream: param first, then context var, then env var with default fallback ctx_project = project if project is not None else _project_context.get(None) diff --git a/tests/test_logger_otel_context.py b/tests/test_logger_otel_context.py new file mode 100644 index 00000000..fc435d75 --- /dev/null +++ b/tests/test_logger_otel_context.py @@ -0,0 +1,292 @@ +import asyncio +import atexit +from collections.abc import Callable, Generator + +import pytest +from opentelemetry import context, propagate, trace +from opentelemetry.trace import SpanContext, TraceFlags + +from splunk_ao.logger import SplunkAOLogger +from splunk_ao.logger.logger import _otel_context_state + + +@pytest.fixture(autouse=True) +def isolated_otel_context() -> Generator[None, None, None]: + state_token = _otel_context_state.set(None) + token = context.attach(context.Context()) + try: + yield + finally: + context.detach(token) + _otel_context_state.reset(state_token) + + +@pytest.fixture +def make_logger() -> Generator[Callable[[], SplunkAOLogger], None, None]: + loggers: list[SplunkAOLogger] = [] + + def factory() -> SplunkAOLogger: + logger = SplunkAOLogger(ingestion_hook=lambda _: None) + loggers.append(logger) + return logger + + yield factory + + for logger in loggers: + atexit.unregister(logger.terminate) + if logger.current_parent() is not None: + logger.conclude(output="cleanup", conclude_all=True) + + +def test_start_trace_assigns_and_activates_fresh_context(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + + root_ids = logger._otel_ids[root.id] + active = trace.get_current_span().get_span_context() + + assert root_ids.span_context.is_valid + assert root_ids.parent_span_context is None + assert active == root_ids.span_context + assert not hasattr(logger, "_otel_trace_id") + + logger.conclude(output="a") + assert not trace.get_current_span().get_span_context().is_valid + assert logger._otel_ids == {} + + +def test_every_path1_step_gets_stable_ids_and_actual_parent(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + workflow = logger.add_workflow_span(input="workflow") + agent = logger.add_agent_span(input="agent") + agent_context = logger._otel_ids[agent.id].span_context + + llm = logger.add_llm_span(input="prompt", output="answer", model="model") + retriever = logger.add_retriever_span(input="query", output=["document"]) + tool = logger.add_tool_span(input="arguments", output="result", name="tool") + control = logger.add_control_span(input="control") + + steps = [root, workflow, agent, llm, retriever, tool, control] + assert all(step.id in logger._otel_ids for step in steps) + assert logger._otel_ids[workflow.id].parent_span_context == logger._otel_ids[root.id].span_context + assert logger._otel_ids[agent.id].parent_span_context == logger._otel_ids[workflow.id].span_context + + for leaf in (llm, retriever, tool, control): + assert leaf is not None + leaf_ids = logger._otel_ids[leaf.id] + assert leaf_ids.parent_span_context == agent_context + assert leaf_ids.span_context.trace_id == agent_context.trace_id + + assert trace.get_current_span().get_span_context() == agent_context + + logger.conclude(output="agent-output") + assert trace.get_current_span().get_span_context() == logger._otel_ids[workflow.id].span_context + assert all(step.id not in logger._otel_ids for step in (agent, llm, retriever, tool, control)) + logger.conclude(output="workflow-output") + logger.conclude(output="trace-output") + assert logger._otel_ids == {} + + +def test_completed_leaf_siblings_share_parent_and_do_not_become_active( + make_logger: Callable[[], SplunkAOLogger], +) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + root_context = logger._otel_ids[root.id].span_context + + first = logger.add_llm_span(input="first", output="one", model="model") + second = logger.add_tool_span(input="second", output="two", name="tool") + + assert logger._otel_ids[first.id].parent_span_context == root_context + assert logger._otel_ids[second.id].parent_span_context == root_context + assert trace.get_current_span().get_span_context() == root_context + + logger.conclude(output="done") + + +@pytest.mark.parametrize("parent_kind", ["tool", "retriever"]) +def test_promoted_parent_becomes_active_and_parents_children( + make_logger: Callable[[], SplunkAOLogger], parent_kind: str +) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + + if parent_kind == "tool": + parent = logger.add_tool_span(input="arguments", output="result", name="tool") + else: + parent = logger.add_retriever_span(input="query", output=["document"]) + + parent._parent = root + logger._set_current_parent(parent) + assert trace.get_current_span().get_span_context() == logger._otel_ids[parent.id].span_context + + child = logger.add_llm_span(input="prompt", output="answer", model="model") + assert logger._otel_ids[child.id].parent_span_context == logger._otel_ids[parent.id].span_context + + logger.conclude(output=parent.output) + assert trace.get_current_span().get_span_context() == logger._otel_ids[root.id].span_context + logger.conclude(output="trace-output") + + +def test_deep_parent_chain_restores_each_open_context(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + workflow = logger.add_workflow_span(input="workflow") + agent = logger.add_agent_span(input="agent") + llm = logger.add_llm_span(input="prompt", output="answer", model="model") + + assert logger._otel_ids[workflow.id].parent_span_context == logger._otel_ids[root.id].span_context + assert logger._otel_ids[agent.id].parent_span_context == logger._otel_ids[workflow.id].span_context + assert logger._otel_ids[llm.id].parent_span_context == logger._otel_ids[agent.id].span_context + assert logger._current_otel_span_id() == logger._otel_ids[agent.id].span_context.span_id + + logger.conclude(output="agent-output") + assert logger._current_otel_span_id() == logger._otel_ids[workflow.id].span_context.span_id + logger.conclude(output="workflow-output") + assert logger._current_otel_span_id() == logger._otel_ids[root.id].span_context.span_id + logger.conclude(output="trace-output") + assert not trace.get_current_span().get_span_context().is_valid + + +def test_single_llm_trace_assigns_both_contexts_and_cleans_up( + make_logger: Callable[[], SplunkAOLogger], monkeypatch: pytest.MonkeyPatch +) -> None: + logger = make_logger() + assigned: list[tuple[SpanContext | None, SpanContext]] = [] + original = SplunkAOLogger._assign_otel_context + + def recording_assign( + self: SplunkAOLogger, otel_trace_id: int, parent_span_context: SpanContext | None, trace_state + ) -> SpanContext: + span_context = original(self, otel_trace_id, parent_span_context, trace_state) + assigned.append((parent_span_context, span_context)) + return span_context + + monkeypatch.setattr(SplunkAOLogger, "_assign_otel_context", recording_assign) + logger.add_single_llm_span_trace(input="q", output="a", model="model") + + assert len(assigned) == 2 + assert assigned[0][0] is None + assert assigned[1][0] == assigned[0][1] + assert assigned[1][1].trace_id == assigned[0][1].trace_id + assert logger._otel_ids == {} + assert not trace.get_current_span().get_span_context().is_valid + + +def test_start_trace_inherits_remote_parent_and_preserves_tracestate(make_logger: Callable[[], SplunkAOLogger]) -> None: + carrier = {"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01", "tracestate": "vendor=value"} + remote_context = propagate.extract(carrier) + remote_span_context = trace.get_current_span(remote_context).get_span_context() + token = context.attach(remote_context) + try: + logger = make_logger() + root = logger.start_trace(input="q") + root_ids = logger._otel_ids[root.id] + + assert root_ids.span_context.trace_id == remote_span_context.trace_id + assert root_ids.parent_span_context == remote_span_context + assert root_ids.parent_span_context.is_remote + assert root_ids.span_context.trace_state == remote_span_context.trace_state + + logger.add_llm_span(input="prompt", output="answer", model="model") + carrier_out: dict[str, str] = {} + propagate.inject(carrier_out) + assert carrier_out["tracestate"] == "vendor=value" + + logger.conclude(output="a") + assert trace.get_current_span().get_span_context() == remote_span_context + finally: + context.detach(token) + + +def test_trace_flags_are_always_sampled_with_unsampled_remote_parent(make_logger: Callable[[], SplunkAOLogger]) -> None: + remote_context = propagate.extract({"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-00"}) + token = context.attach(remote_context) + try: + logger = make_logger() + root = logger.start_trace(input="q") + child = logger.add_llm_span(input="prompt", output="answer", model="model") + + assert logger._otel_ids[root.id].span_context.trace_flags == TraceFlags(TraceFlags.SAMPLED) + assert logger._otel_ids[child.id].span_context.trace_flags == TraceFlags(TraceFlags.SAMPLED) + logger.conclude(output="a") + finally: + context.detach(token) + + +@pytest.mark.asyncio +async def test_concurrent_traces_on_same_logger_are_isolated(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger = make_logger() + results: dict[str, dict[str, int]] = {} + + async def run_trace(label: str) -> None: + root = logger.start_trace(input=label) + root_context = logger._otel_ids[root.id].span_context + await asyncio.sleep(0) + workflow = logger.add_workflow_span(input=f"{label}-workflow") + await asyncio.sleep(0) + child = logger.add_llm_span(input=label, output="done", model="model") + results[label] = { + "trace_id": root_context.trace_id, + "root_span_id": root_context.span_id, + "workflow_span_id": logger._otel_ids[workflow.id].span_context.span_id, + "child_parent_id": logger._otel_ids[child.id].parent_span_context.span_id, + } + logger.conclude(output="workflow-done") + assert logger._current_otel_span_id() == root_context.span_id + await asyncio.sleep(0) + logger.conclude(output="trace-done") + + await asyncio.gather(run_trace("request-a"), run_trace("request-b")) + + assert results["request-a"]["trace_id"] != results["request-b"]["trace_id"] + assert results["request-a"]["child_parent_id"] == results["request-a"]["workflow_span_id"] + assert results["request-b"]["child_parent_id"] == results["request-b"]["workflow_span_id"] + assert not trace.get_current_span().get_span_context().is_valid + assert logger._otel_ids == {} + + +@pytest.mark.asyncio +async def test_copied_async_context_can_add_and_conclude_child(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger = make_logger() + root = logger.start_trace(input="q") + root_context = logger._otel_ids[root.id].span_context + + async def run_child() -> None: + workflow = logger.add_workflow_span(input="workflow") + assert trace.get_current_span().get_span_context() == logger._otel_ids[workflow.id].span_context + logger.conclude(output="workflow-output") + assert trace.get_current_span().get_span_context() == root_context + + await asyncio.create_task(run_child()) + + assert trace.get_current_span().get_span_context() == root_context + logger.conclude(output="trace-output") + assert not trace.get_current_span().get_span_context().is_valid + + +def test_interleaved_logger_reset_preserves_current_logger(make_logger: Callable[[], SplunkAOLogger]) -> None: + logger_a = make_logger() + logger_b = make_logger() + logger_a.start_trace(input="a") + root_b = logger_b.start_trace(input="b") + workflow_b = logger_b.add_workflow_span(input="workflow-b") + workflow_b_context = logger_b._otel_ids[workflow_b.id].span_context + + logger_a.reset_parent_tracking() + + assert trace.get_current_span().get_span_context() == workflow_b_context + assert logger_a._otel_ids == {} + logger_b.conclude(output="workflow-output") + assert trace.get_current_span().get_span_context() == logger_b._otel_ids[root_b.id].span_context + logger_b.conclude(output="trace-output") + assert not trace.get_current_span().get_span_context().is_valid + + +def test_logger_does_not_replace_global_tracer_provider(make_logger: Callable[[], SplunkAOLogger]) -> None: + provider_before = trace.get_tracer_provider() + logger = make_logger() + logger.start_trace(input="q") + logger.conclude(output="a") + assert trace.get_tracer_provider() is provider_before