diff --git a/agentops/instrumentation/agentic/openai_agents/attributes/common.py b/agentops/instrumentation/agentic/openai_agents/attributes/common.py index 154055db1..e8271c9c8 100644 --- a/agentops/instrumentation/agentic/openai_agents/attributes/common.py +++ b/agentops/instrumentation/agentic/openai_agents/attributes/common.py @@ -93,6 +93,13 @@ } +# Attribute mapping for GuardrailSpanData +GUARDRAIL_SPAN_ATTRIBUTES: AttributeMap = { + WorkflowAttributes.WORKFLOW_INPUT: "input", + WorkflowAttributes.WORKFLOW_OUTPUT: "output", +} + + def _get_llm_messages_attributes(messages: Optional[List[Dict]], attribute_base: str) -> AttributeMap: """ Extracts attributes from a list of message dictionaries (e.g., prompts or completions). @@ -512,6 +519,30 @@ def get_speech_group_span_attributes(span_data: Any) -> AttributeMap: return attributes +def get_guardrail_span_attributes(span_data: Any) -> AttributeMap: + """Extract attributes from a GuardrailSpanData object. + + Guardrails are validation checks on agent inputs or outputs. + + Args: + span_data: The GuardrailSpanData object + + Returns: + Dictionary of attributes for guardrail span + """ + attributes = _extract_attributes_from_mapping(span_data, GUARDRAIL_SPAN_ATTRIBUTES) + attributes.update(get_common_attributes()) + attributes[SpanAttributes.AGENTOPS_SPAN_KIND] = AgentOpsSpanKindValues.GUARDRAIL.value + + if hasattr(span_data, "name") and span_data.name: + attributes["guardrail.name"] = str(span_data.name) + + if hasattr(span_data, "triggered") and span_data.triggered is not None: + attributes["guardrail.triggered"] = bool(span_data.triggered) + + return attributes + + def get_span_attributes(span_data: Any) -> AttributeMap: """Get attributes for a span based on its type. @@ -542,6 +573,8 @@ def get_span_attributes(span_data: Any) -> AttributeMap: attributes = get_speech_span_attributes(span_data) elif span_type == "SpeechGroupSpanData": attributes = get_speech_group_span_attributes(span_data) + elif span_type == "GuardrailSpanData": + attributes = get_guardrail_span_attributes(span_data) else: logger.debug(f"[agentops.instrumentation.openai_agents.attributes] Unknown span type: {span_type}") attributes = {} diff --git a/agentops/instrumentation/agentic/openai_agents/exporter.py b/agentops/instrumentation/agentic/openai_agents/exporter.py index 1fc5b345a..a2bb34c08 100644 --- a/agentops/instrumentation/agentic/openai_agents/exporter.py +++ b/agentops/instrumentation/agentic/openai_agents/exporter.py @@ -78,6 +78,8 @@ def get_span_kind(span: Any) -> SpanKind: return SpanKind.CONSUMER elif span_type in ["FunctionSpanData", "GenerationSpanData", "ResponseSpanData"]: return SpanKind.CLIENT + elif span_type in ["HandoffSpanData", "GuardrailSpanData"]: + return SpanKind.INTERNAL else: return SpanKind.INTERNAL diff --git a/examples/openai_agents/agent_guardrails.py b/examples/openai_agents/agent_guardrails.py index 2429dab4b..046e6fe1a 100644 --- a/examples/openai_agents/agent_guardrails.py +++ b/examples/openai_agents/agent_guardrails.py @@ -19,9 +19,8 @@ input_guardrail, ) -# Initialize agentops and import the guardrail decorator +# Initialize agentops import agentops -from agentops import guardrail # Load API keys import os @@ -36,7 +35,7 @@ agentops.init(api_key=os.environ["AGENTOPS_API_KEY"], tags=["agentops-example"]) -# OpenAI Agents SDK guardrail example with agentops guardrails decorator for observability +# OpenAI Agents SDK guardrail example with AgentOps observability class MathHomeworkOutput(BaseModel): is_math_homework: bool reasoning: str @@ -50,7 +49,6 @@ class MathHomeworkOutput(BaseModel): @input_guardrail -@guardrail(spec="input") # Specify guardrail type as input or output async def math_guardrail( ctx: RunContextWrapper[None], agent: Agent, input: str | list[TResponseInputItem] ) -> GuardrailFunctionOutput: diff --git a/tests/unit/instrumentation/openai_agents/test_openai_agents_attributes.py b/tests/unit/instrumentation/openai_agents/test_openai_agents_attributes.py index d05f79565..51c6c44ac 100644 --- a/tests/unit/instrumentation/openai_agents/test_openai_agents_attributes.py +++ b/tests/unit/instrumentation/openai_agents/test_openai_agents_attributes.py @@ -18,6 +18,7 @@ get_agent_span_attributes, get_function_span_attributes, get_generation_span_attributes, + get_guardrail_span_attributes, get_handoff_span_attributes, get_response_span_attributes, get_span_attributes, @@ -408,6 +409,49 @@ def test_handoff_span_attributes(self): assert attrs[AgentAttributes.FROM_AGENT] == "source_agent" assert attrs[AgentAttributes.TO_AGENT] == "target_agent" + def test_guardrail_span_attributes(self): + """Test extraction of attributes from a GuardrailSpanData object""" + # Create a mock GuardrailSpanData + mock_guardrail_span = MagicMock() + mock_guardrail_span.__class__.__name__ = "GuardrailSpanData" + mock_guardrail_span.name = "math_homework_check" + mock_guardrail_span.input = "Can you help me with my math homework?" + mock_guardrail_span.output = "Guardrail triggered: No homework assistance allowed" + mock_guardrail_span.triggered = True + + # Extract attributes + attrs = get_guardrail_span_attributes(mock_guardrail_span) + + # Verify extracted attributes + assert "agentops.span.kind" in attrs + assert attrs["agentops.span.kind"] == "guardrail" + assert "guardrail.name" in attrs + assert attrs["guardrail.name"] == "math_homework_check" + assert "guardrail.triggered" in attrs + assert attrs["guardrail.triggered"] is True + + def test_guardrail_span_attributes_without_optional_fields(self): + """Test extraction of attributes from a GuardrailSpanData object without optional fields""" + + # Create a simple class instead of MagicMock to avoid automatic attribute creation + class GuardrailSpanData: + def __init__(self): + self.__class__.__name__ = "GuardrailSpanData" + self.input = "Test input" + self.output = "Test output" + # Explicitly no name or triggered attributes + + mock_guardrail_span = GuardrailSpanData() + + # Extract attributes + attrs = get_guardrail_span_attributes(mock_guardrail_span) + + # Verify core attributes are present + assert "agentops.span.kind" in attrs + assert attrs["agentops.span.kind"] == "guardrail" + assert "guardrail.name" not in attrs + assert "guardrail.triggered" not in attrs + def test_response_span_attributes(self): """Test extraction of attributes from a ResponseSpanData object""" @@ -453,6 +497,13 @@ def __init__(self): self.name = "test_function" self.input = "test input" + class GuardrailSpanData: + def __init__(self): + self.__class__.__name__ = "GuardrailSpanData" + self.name = "test_guardrail" + self.input = "test input" + self.output = "test output" + class UnknownSpanData: def __init__(self): self.__class__.__name__ = "UnknownSpanData" @@ -460,6 +511,7 @@ def __init__(self): # Use our simple classes agent_span = AgentSpanData() function_span = FunctionSpanData() + guardrail_span = GuardrailSpanData() unknown_span = UnknownSpanData() # Patch the serialization function to avoid infinite recursion @@ -472,6 +524,10 @@ def __init__(self): assert "tool.name" in function_attrs assert function_attrs["tool.name"] == "test_function" + guardrail_attrs = get_span_attributes(guardrail_span) + assert "agentops.span.kind" in guardrail_attrs + assert guardrail_attrs["agentops.span.kind"] == "guardrail" + # Unknown span type should return empty dict unknown_attrs = get_span_attributes(unknown_span) assert unknown_attrs == {} diff --git a/uv.lock b/uv.lock index b0cf21ee2..ca8f82e6a 100644 --- a/uv.lock +++ b/uv.lock @@ -1,15 +1,9 @@ version = 1 -revision = 1 -requires-python = ">=3.9, <3.14" +requires-python = ">=3.9" resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] [manifest] @@ -20,9 +14,10 @@ constraints = [ [[package]] name = "agentops" -version = "0.4.6" +version = "0.4.16" source = { editable = "." } dependencies = [ + { name = "httpx" }, { name = "opentelemetry-api", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "opentelemetry-api", version = "1.31.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "opentelemetry-exporter-otlp-proto-http", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -45,8 +40,8 @@ dependencies = [ [package.dev-dependencies] dev = [ { name = "ipython", version = "8.18.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "ipython", version = "8.35.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "ipython", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython", version = "8.35.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "ipython", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13'" }, { name = "mypy" }, { name = "pdbpp" }, { name = "pyfakefs" }, @@ -61,8 +56,7 @@ dev = [ { name = "ruff" }, { name = "types-requests" }, { name = "vcrpy", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "vcrpy", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, - { name = "vcrpy", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "vcrpy", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] test = [ { name = "anthropic" }, @@ -74,19 +68,20 @@ test = [ [package.metadata] requires-dist = [ + { name = "httpx", specifier = ">=0.24.0,<0.29.0" }, { name = "opentelemetry-api", marker = "python_full_version < '3.10'", specifier = "==1.29.0" }, { name = "opentelemetry-api", marker = "python_full_version >= '3.10'", specifier = ">1.29.0" }, { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version < '3.10'", specifier = "==1.29.0" }, { name = "opentelemetry-exporter-otlp-proto-http", marker = "python_full_version >= '3.10'", specifier = ">1.29.0" }, { name = "opentelemetry-instrumentation", marker = "python_full_version < '3.10'", specifier = "==0.50b0" }, - { name = "opentelemetry-instrumentation", marker = "python_full_version >= '3.10'", specifier = ">0.50b0" }, + { name = "opentelemetry-instrumentation", marker = "python_full_version >= '3.10'", specifier = ">=0.50b0" }, { name = "opentelemetry-sdk", marker = "python_full_version < '3.10'", specifier = "==1.29.0" }, { name = "opentelemetry-sdk", marker = "python_full_version >= '3.10'", specifier = ">1.29.0" }, { name = "opentelemetry-semantic-conventions", marker = "python_full_version < '3.10'", specifier = "==0.50b0" }, - { name = "opentelemetry-semantic-conventions", marker = "python_full_version >= '3.10'", specifier = ">0.50b0" }, + { name = "opentelemetry-semantic-conventions", marker = "python_full_version >= '3.10'", specifier = ">=0.50b0" }, { name = "ordered-set", specifier = ">=4.0.0,<5.0.0" }, { name = "packaging", specifier = ">=21.0,<25.0" }, - { name = "psutil", specifier = ">=5.9.8,<6.1.0" }, + { name = "psutil", specifier = ">=5.9.8,<7.0.1" }, { name = "pyyaml", specifier = ">=5.3,<7.0" }, { name = "requests", specifier = ">=2.0.0,<3.0.0" }, { name = "termcolor", specifier = ">=2.3.0,<2.5.0" }, @@ -267,7 +262,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -433,7 +428,7 @@ name = "fancycompleter" version = "0.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pyreadline", marker = "sys_platform == 'win32'" }, + { name = "pyreadline", marker = "platform_system == 'Windows'" }, { name = "pyrepl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/95/649d135442d8ecf8af5c7e235550c628056423c96c4bc6787348bdae9248/fancycompleter-0.9.1.tar.gz", hash = "sha256:09e0feb8ae242abdfd7ef2ba55069a46f011814a80fe5476be48f51b00247272", size = 10866 } @@ -620,8 +615,7 @@ name = "importlib-metadata" version = "8.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "zipp", marker = "python_full_version < '3.10'" }, @@ -636,12 +630,8 @@ name = "importlib-metadata" version = "8.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "zipp", marker = "python_full_version >= '3.10'" }, @@ -665,8 +655,7 @@ name = "ipython" version = "8.18.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, @@ -691,21 +680,20 @@ name = "ipython" version = "8.35.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", ] dependencies = [ - { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "python_full_version >= '3.10' and python_full_version < '3.13' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, - { name = "jedi", marker = "python_full_version == '3.10.*'" }, - { name = "matplotlib-inline", marker = "python_full_version == '3.10.*'" }, - { name = "pexpect", marker = "python_full_version == '3.10.*' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version == '3.10.*'" }, - { name = "pygments", marker = "python_full_version == '3.10.*'" }, - { name = "stack-data", marker = "python_full_version == '3.10.*'" }, - { name = "traitlets", marker = "python_full_version == '3.10.*'" }, - { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, + { name = "jedi", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "pexpect", marker = "python_full_version >= '3.10' and python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "pygments", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "stack-data", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "traitlets", marker = "python_full_version >= '3.10' and python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0c/77/7d1501e8b539b179936e0d5969b578ed23887be0ab8c63e0120b825bda3e/ipython-8.35.0.tar.gz", hash = "sha256:d200b7d93c3f5883fc36ab9ce28a18249c7706e51347681f80a0aef9895f2520", size = 5605027 } wheels = [ @@ -717,23 +705,19 @@ name = "ipython" version = "9.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.11'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, - { name = "jedi", marker = "python_full_version >= '3.11'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, - { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "stack-data", marker = "python_full_version >= '3.11'" }, - { name = "traitlets", marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, + "python_full_version >= '3.13'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.13' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.13'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.13'" }, + { name = "jedi", marker = "python_full_version >= '3.13'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.13'" }, + { name = "pexpect", marker = "python_full_version >= '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.13'" }, + { name = "pygments", marker = "python_full_version >= '3.13'" }, + { name = "stack-data", marker = "python_full_version >= '3.13'" }, + { name = "traitlets", marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/9a/6b8984bedc990f3a4aa40ba8436dea27e23d26a64527de7c2e5e12e76841/ipython-9.1.0.tar.gz", hash = "sha256:a47e13a5e05e02f3b8e1e7a0f9db372199fe8c3763532fe7a1e0379e4e135f16", size = 4373688 } wheels = [ @@ -745,7 +729,7 @@ name = "ipython-pygments-lexers" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } wheels = [ @@ -1127,8 +1111,7 @@ name = "networkx" version = "3.2.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928 } wheels = [ @@ -1140,12 +1123,8 @@ name = "networkx" version = "3.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } wheels = [ @@ -1262,8 +1241,7 @@ name = "opentelemetry-api" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "deprecated", marker = "python_full_version < '3.10'" }, @@ -1279,12 +1257,8 @@ name = "opentelemetry-api" version = "1.31.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "deprecated", marker = "python_full_version >= '3.10'" }, @@ -1300,8 +1274,7 @@ name = "opentelemetry-exporter-otlp-proto-common" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "opentelemetry-proto", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -1316,12 +1289,8 @@ name = "opentelemetry-exporter-otlp-proto-common" version = "1.31.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "opentelemetry-proto", version = "1.31.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -1336,8 +1305,7 @@ name = "opentelemetry-exporter-otlp-proto-http" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "deprecated", marker = "python_full_version < '3.10'" }, @@ -1358,12 +1326,8 @@ name = "opentelemetry-exporter-otlp-proto-http" version = "1.31.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "deprecated", marker = "python_full_version >= '3.10'" }, @@ -1384,8 +1348,7 @@ name = "opentelemetry-instrumentation" version = "0.50b0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "opentelemetry-api", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -1403,12 +1366,8 @@ name = "opentelemetry-instrumentation" version = "0.52b1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "opentelemetry-api", version = "1.31.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -1426,8 +1385,7 @@ name = "opentelemetry-proto" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "protobuf", marker = "python_full_version < '3.10'" }, @@ -1442,12 +1400,8 @@ name = "opentelemetry-proto" version = "1.31.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "protobuf", marker = "python_full_version >= '3.10'" }, @@ -1462,8 +1416,7 @@ name = "opentelemetry-sdk" version = "1.29.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "opentelemetry-api", version = "1.29.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -1480,12 +1433,8 @@ name = "opentelemetry-sdk" version = "1.31.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "opentelemetry-api", version = "1.31.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -1502,8 +1451,7 @@ name = "opentelemetry-semantic-conventions" version = "0.50b0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "deprecated", marker = "python_full_version < '3.10'" }, @@ -1519,12 +1467,8 @@ name = "opentelemetry-semantic-conventions" version = "0.52b1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ { name = "deprecated", marker = "python_full_version >= '3.10'" }, @@ -2008,8 +1952,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, { name = "vcrpy", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "vcrpy", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, - { name = "vcrpy", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "vcrpy", version = "5.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fe/2a/ea6b8036ae01979eae02d8ad5a7da14dec90d9176b613e49fb8d134c78fc/pytest_recording-0.13.2.tar.gz", hash = "sha256:000c3babbb466681457fd65b723427c1779a0c6c17d9e381c3142a701e124877", size = 25270 } wheels = [ @@ -2301,7 +2244,7 @@ name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ @@ -2442,8 +2385,7 @@ name = "vcrpy" version = "4.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.10' and platform_python_implementation == 'PyPy'", - "python_full_version < '3.10' and platform_python_implementation != 'PyPy'", + "python_full_version < '3.10'", ] dependencies = [ { name = "pyyaml", marker = "python_full_version < '3.10'" }, @@ -2461,40 +2403,19 @@ name = "vcrpy" version = "5.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation == 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation == 'PyPy'", + "python_full_version >= '3.10' and python_full_version < '3.13'", + "python_full_version >= '3.13'", ] dependencies = [ - { name = "pyyaml", marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, - { name = "wrapt", marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, - { name = "yarl", marker = "python_full_version >= '3.10' and platform_python_implementation == 'PyPy'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10'" }, + { name = "wrapt", marker = "python_full_version >= '3.10'" }, + { name = "yarl", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a5/ea/a166a3cce4ac5958ba9bbd9768acdb1ba38ae17ff7986da09fa5b9dbc633/vcrpy-5.1.0.tar.gz", hash = "sha256:bbf1532f2618a04f11bce2a99af3a9647a32c880957293ff91e0a5f187b6b3d2", size = 84576 } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/5b/3f70bcb279ad30026cc4f1df0a0491a0205a24dddd88301f396c485de9e7/vcrpy-5.1.0-py2.py3-none-any.whl", hash = "sha256:605e7b7a63dcd940db1df3ab2697ca7faf0e835c0852882142bafb19649d599e", size = 41969 }, ] -[[package]] -name = "vcrpy" -version = "7.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version >= '3.11' and python_full_version < '3.13' and platform_python_implementation != 'PyPy'", - "python_full_version == '3.10.*' and platform_python_implementation != 'PyPy'", -] -dependencies = [ - { name = "pyyaml", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "urllib3", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "wrapt", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, - { name = "yarl", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/d3/856e06184d4572aada1dd559ddec3bedc46df1f2edc5ab2c91121a2cccdb/vcrpy-7.0.0.tar.gz", hash = "sha256:176391ad0425edde1680c5b20738ea3dc7fb942520a48d2993448050986b3a50", size = 85502 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/5d/1f15b252890c968d42b348d1e9b0aa12d5bf3e776704178ec37cceccdb63/vcrpy-7.0.0-py2.py3-none-any.whl", hash = "sha256:55791e26c18daa363435054d8b35bd41a4ac441b6676167635d1b37a71dbe124", size = 42321 }, -] - [[package]] name = "watchfiles" version = "1.0.4"