From 4972006a407fb8153ae782bffe96d77c3eb37666 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:08 +0800 Subject: [PATCH 01/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md --- .../CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md new file mode 100644 index 000000000..8f9cde2ab --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md @@ -0,0 +1,18 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## Unreleased + +### Added + +- Initial release of `loongsuite-instrumentation-a2a`: automatic + instrumentation for the official A2A (Agent2Agent) Python SDK (`a2a-sdk`). + Produces an ARMS gen-ai `AGENT` span around each server-side + `AgentExecutor.execute` invocation (covering both existing and + future-defined executor subclasses), complementing — rather than + duplicating — the SDK's built-in transport/request-handler tracing. + ([#28](https://github.com/alibaba/loongsuite-python/issues/28)) From ca0bd44744440952533c533dc91f6fd5c12edb3c Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:11 +0800 Subject: [PATCH 02/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/LICENSE --- .../loongsuite-instrumentation-a2a/LICENSE | 201 ++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/LICENSE diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/LICENSE b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. From f34733f043845bc466a1f21f121e7aac5f43d689 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:15 +0800 Subject: [PATCH 03/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/pyproject.toml --- .../pyproject.toml | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/pyproject.toml diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/pyproject.toml b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/pyproject.toml new file mode 100644 index 000000000..764f9706e --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/pyproject.toml @@ -0,0 +1,54 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "loongsuite-instrumentation-a2a" +dynamic = ["version"] +description = "LoongSuite A2A (Agent2Agent) Instrumentation" +license = "Apache-2.0" +requires-python = ">=3.10" +authors = [ + { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "opentelemetry-api >= 1.37.0", + "opentelemetry-instrumentation >= 0.58b0", + "opentelemetry-semantic-conventions >= 0.58b0", + "wrapt >= 1.17.3, < 2.0.0", +] + +[project.optional-dependencies] +instruments = [ + "a2a-sdk >= 0.2.0", +] + +[project.entry-points.opentelemetry_instrumentor] +a2a = "opentelemetry.instrumentation.a2a:A2AInstrumentor" + +[project.urls] +Homepage = "https://github.com/alibaba/loongsuite-python/tree/main/instrumentation-loongsuite/loongsuite-instrumentation-a2a" +Repository = "https://github.com/alibaba/loongsuite-python" + +[tool.hatch.version] +path = "src/opentelemetry/instrumentation/a2a/version.py" + +[tool.hatch.build.targets.sdist] +include = [ + "/src", + "/tests", +] + +[tool.hatch.build.targets.wheel] +packages = ["src/opentelemetry"] From d0688885312f812aa7651952b057616d11355181 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:18 +0800 Subject: [PATCH 04/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md --- .../loongsuite-instrumentation-a2a/README.md | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md new file mode 100644 index 000000000..5e52befa9 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md @@ -0,0 +1,44 @@ +# LoongSuite A2A Instrumentation + +OpenTelemetry instrumentation for the official +[A2A (Agent2Agent) Python SDK](https://github.com/a2aproject/a2a-python) +(`a2a-sdk`). + +This package adds an ARMS gen-ai **AGENT** span around each server-side agent +turn, bracketing the user's `AgentExecutor.execute` implementation so that all +downstream work (the SDK's own transport/request-handler spans, plus any LLM +or tool instrumentation) nests underneath a single `invoke_agent` span with a +shared trace id. + +It is **complementary** to the tracing already built into `a2a-sdk` +(`a2a.utils.telemetry`): the SDK traces protocol plumbing under the +`a2a-python-sdk` instrumenting module with generic span names and no gen-ai +semantic conventions, and it does not wrap the user's `execute` method. This +package supplies exactly that missing gen-ai agent boundary. + +## Installation + +```bash +pip install loongsuite-instrumentation-a2a +``` + +## Usage + +```python +from opentelemetry.instrumentation.a2a import A2AInstrumentor + +A2AInstrumentor().instrument() +``` + +Instrumentation covers both `AgentExecutor` subclasses that already exist when +`instrument()` is called and any defined afterwards (via an +`__init_subclass__` hook installed on `AgentExecutor`). + +## Content capture + +The user's input message is captured on `gen_ai.input.messages` by default. To +suppress it while keeping the structural AGENT span: + +```bash +export OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT=false +``` From 0ba4ddc46c75544df7962dd0c2b02ef55a991bb8 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:22 +0800 Subject: [PATCH 05/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt --- .../loongsuite-instrumentation-a2a/test-requirements.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt new file mode 100644 index 000000000..f695549a2 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt @@ -0,0 +1,9 @@ +pytest +pytest-asyncio +pytest-forked==1.6.0 +setuptools +wrapt +a2a-sdk + +-e opentelemetry-instrumentation +-e instrumentation-loongsuite/loongsuite-instrumentation-a2a From 3990af01dfdccfba3f0df20473d7a7cdbb838934 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:43:25 +0800 Subject: [PATCH 06/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/package.py --- .../opentelemetry/instrumentation/a2a/package.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/package.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/package.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/package.py new file mode 100644 index 000000000..81369a92d --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/package.py @@ -0,0 +1,15 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +_instruments = ("a2a-sdk >= 0.2.0",) From a7c322d46178bdf58c731d17626a203069d19c62 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:44:02 +0800 Subject: [PATCH 07/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md From 5260bc9f8f6d0ac20689caf5366b1f501e28d901 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:47:59 +0800 Subject: [PATCH 08/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/version.py --- .../opentelemetry/instrumentation/a2a/version.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/version.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/version.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/version.py new file mode 100644 index 000000000..3a48c29e5 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/version.py @@ -0,0 +1,15 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "0.10.0.dev" From 1cdbbd231c8f3b518ecdc2d18f31bf722f2498c5 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:48:42 +0800 Subject: [PATCH 09/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py --- .../instrumentation/a2a/__init__.py | 296 ++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py new file mode 100644 index 000000000..64c8f5eb5 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py @@ -0,0 +1,296 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +OpenTelemetry A2A (Agent2Agent) Instrumentation + +Produces an ARMS gen-ai **AGENT** span around each server-side agent turn of +the official A2A Python SDK (``a2a-sdk``). The span brackets the user's +``AgentExecutor.execute`` invocation, so all work the agent does — including +the SDK's own transport / request-handler spans and any downstream LLM / +tool instrumentation — nests underneath a single ``invoke_agent`` span with a +shared trace id. + +Relationship to a2a-sdk's built-in tracing +------------------------------------------ +``a2a-sdk`` already ships an OpenTelemetry tracing layer +(``a2a.utils.telemetry``) that decorates its transports and request handlers +with generic spans under the instrumenting module ``a2a-python-sdk``. Those +spans describe the *protocol plumbing*; none of them carry gen-ai semantic +conventions and none of them wraps the user's ``execute`` implementation +(``AgentExecutor.execute`` is an abstract method the application overrides). + +This package is therefore **complementary, not duplicative**: it adds the +gen-ai AGENT boundary that the SDK does not, mirroring how the sibling +``loongsuite`` packages layer ARMS gen-ai spans over frameworks that already +emit some telemetry (e.g. litellm). + +Instrumentation seam +-------------------- +``AgentExecutor`` is an ABC whose ``execute`` coroutine is overridden by +every concrete agent. To trace all of them we: + +1. Walk the existing ``AgentExecutor`` subclass tree at ``instrument`` time + and wrap each subclass's own ``execute`` (via ``wrapt``). +2. Install an ``__init_subclass__`` hook on ``AgentExecutor`` so that agent + classes defined *after* instrumentation are wrapped as they are created. + +Both paths mark the wrapped function with a sentinel so double-wrapping is +impossible, and ``uninstrument`` unwraps every marked ``execute`` and +restores the original ``__init_subclass__``. + +Content capture +--------------- +The user's input message is recorded as ``gen_ai.input.messages`` when +available. Set ``OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT=false`` to suppress +message content while keeping the structural AGENT span. +""" + +import json +import logging +import os +from typing import Any, Collection, Optional + +from wrapt import wrap_function_wrapper + +from opentelemetry import trace as trace_api +from opentelemetry.instrumentation.instrumentor import BaseInstrumentor +from opentelemetry.instrumentation.a2a.package import _instruments +from opentelemetry.instrumentation.utils import unwrap +from opentelemetry.trace import SpanKind, Status, StatusCode + +logger = logging.getLogger(__name__) + +# ── Framework identifier ───────────────────────────────────────────────────── +_FRAMEWORK = "a2a" +_AGENT_NAME = "a2a-agent" + +# ── GenAI semantic-convention attribute keys (ARMS gen-ai semconv) ─────────── +_GEN_AI_SPAN_KIND = "gen_ai.span.kind" +_GEN_AI_OPERATION_NAME = "gen_ai.operation.name" +_GEN_AI_FRAMEWORK = "gen_ai.framework" +_GEN_AI_INPUT_MESSAGES = "gen_ai.input.messages" + +_SPAN_KIND_AGENT = "AGENT" +_OP_INVOKE_AGENT = "invoke_agent" + +# ── Sentinel + content toggle ──────────────────────────────────────────────── +_A2A_MARKER = "_otel_a2a_wrapped" +_CAPTURE_CONTENT_ENV = "OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT" + + +def _capture_content() -> bool: + return os.getenv(_CAPTURE_CONTENT_ENV, "true").lower() != "false" + + +def _text_message_json(role: str, content: Any) -> str: + message = { + "role": role, + "parts": [{"type": "text", "content": str(content)}], + } + try: + return json.dumps([message], ensure_ascii=False, separators=(",", ":")) + except Exception: + return str([message]) + + +def _extract_user_input(context: Any) -> Optional[str]: + """Best-effort extraction of the user's text input from a RequestContext.""" + if context is None: + return None + getter = getattr(context, "get_user_input", None) + if callable(getter): + try: + text = getter() + if text: + return str(text) + except Exception: + pass + return None + + +class _ExecuteWrapper: + """Wrap ``AgentExecutor.execute`` to produce the AGENT span.""" + + def __init__(self, tracer): + self._tracer = tracer + + async def __call__(self, wrapped, instance, args, kwargs): + context = args[0] if args else kwargs.get("context") + agent_name = type(instance).__name__ if instance is not None else _AGENT_NAME + + with self._tracer.start_as_current_span( + f"{_OP_INVOKE_AGENT} {_AGENT_NAME}", + kind=SpanKind.SERVER, + ) as span: + span.set_attribute(_GEN_AI_SPAN_KIND, _SPAN_KIND_AGENT) + span.set_attribute(_GEN_AI_OPERATION_NAME, _OP_INVOKE_AGENT) + span.set_attribute(_GEN_AI_FRAMEWORK, _FRAMEWORK) + span.set_attribute("gen_ai.agent.name", agent_name) + + context_id = getattr(context, "context_id", None) + if context_id: + span.set_attribute("a2a.context_id", str(context_id)) + task_id = getattr(context, "task_id", None) + if task_id: + span.set_attribute("a2a.task_id", str(task_id)) + + if _capture_content(): + user_input = _extract_user_input(context) + if user_input: + span.set_attribute( + _GEN_AI_INPUT_MESSAGES, + _text_message_json("user", user_input), + ) + + try: + result = await wrapped(*args, **kwargs) + except Exception as e: + span.record_exception(e) + span.set_status(Status(StatusCode.ERROR)) + raise + + span.set_status(Status(StatusCode.OK)) + return result + + +# ═══════════════════════════════════════════════════════════════════════════ +# Wrap / unwrap helpers +# ═══════════════════════════════════════════════════════════════════════════ + + +def _wrap_execute(cls, wrapper) -> None: + """Wrap ``cls.execute`` exactly once (idempotent via sentinel).""" + own = cls.__dict__.get("execute") + if own is None: + return # abstract / not overridden on this class + if getattr(own, _A2A_MARKER, False): + return + try: + wrap_function_wrapper(cls, "execute", wrapper) + except Exception as e: # pragma: no cover - defensive + logger.debug("Could not wrap %s.execute: %s", cls.__name__, e) + return + new = cls.__dict__.get("execute") + if new is not None: + try: + setattr(new, _A2A_MARKER, True) + except Exception: # pragma: no cover - defensive + pass + + +def _unwrap_execute(cls) -> None: + own = cls.__dict__.get("execute") + if own is None or not getattr(own, _A2A_MARKER, False): + return + try: + delattr(own, _A2A_MARKER) + except (AttributeError, TypeError): + pass + try: + unwrap(cls, "execute") + except Exception as e: # pragma: no cover - defensive + logger.debug("Could not unwrap %s.execute: %s", cls.__name__, e) + + +def _iter_subclasses(base): + seen = set() + stack = list(base.__subclasses__()) + while stack: + cls = stack.pop() + if id(cls) in seen: + continue + seen.add(id(cls)) + yield cls + stack.extend(cls.__subclasses__()) + + +# ═══════════════════════════════════════════════════════════════════════════ +# Instrumentor +# ═══════════════════════════════════════════════════════════════════════════ + + +class A2AInstrumentor(BaseInstrumentor): + """Instrumentor for the official A2A Python SDK (``a2a-sdk``).""" + + def __init__(self): + super().__init__() + self._wrapper = None + self._base = None + self._saved_init_subclass = None + self._wrapped_classes = [] + + def instrumentation_dependencies(self) -> Collection[str]: + return _instruments + + def _instrument(self, **kwargs: Any) -> None: + from a2a.server.agent_execution import AgentExecutor + + tracer_provider = kwargs.get("tracer_provider") + tracer = trace_api.get_tracer( + __name__, "", tracer_provider=tracer_provider + ) + wrapper = _ExecuteWrapper(tracer) + self._wrapper = wrapper + self._base = AgentExecutor + + # 1) Wrap all existing subclasses. + for cls in _iter_subclasses(AgentExecutor): + _wrap_execute(cls, wrapper) + self._wrapped_classes.append(cls) + + # 2) Hook future subclasses via __init_subclass__. + saved = AgentExecutor.__dict__.get("__init_subclass__") + self._saved_init_subclass = saved + + def _new_init_subclass(cls, **kw): + # Preserve any original __init_subclass__ behaviour first. + try: + if saved is not None: + saved.__func__(cls, **kw) + except Exception: # pragma: no cover - defensive + pass + _wrap_execute(cls, wrapper) + + AgentExecutor.__init_subclass__ = classmethod(_new_init_subclass) + + def _uninstrument(self, **kwargs: Any) -> None: + base = self._base + # Unwrap everything we touched, plus any subclass that carries the + # sentinel (covers classes created via the __init_subclass__ hook). + if base is not None: + classes = set(self._wrapped_classes) + classes.update(_iter_subclasses(base)) + for cls in classes: + _unwrap_execute(cls) + + # Restore __init_subclass__. + if self._saved_init_subclass is not None: + base.__init_subclass__ = self._saved_init_subclass + else: + # Remove our override so it falls back to object's default. + try: + del base.__dict__["__init_subclass__"] + except (KeyError, TypeError): + try: + base.__init_subclass__ = classmethod( + lambda cls, **kw: None + ) + except Exception: # pragma: no cover - defensive + pass + + self._wrapper = None + self._base = None + self._saved_init_subclass = None + self._wrapped_classes = [] From 5173b7bab051e3b1e6b4601cea4864344fa9ad9a Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:49:07 +0800 Subject: [PATCH 10/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py --- .../tests/conftest.py | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py new file mode 100644 index 000000000..e56ace03d --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py @@ -0,0 +1,71 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Test configuration for A2A instrumentation tests. + +Tests exercise the instrumentation against the real ``a2a-sdk`` +``AgentExecutor`` ABC and real in-process executor subclasses, asserting on +the OTel spans exported to an ``InMemorySpanExporter``. No network access is +required. +""" + +from __future__ import annotations + +import os +import sys +from pathlib import Path + +import pytest + +_SRC = Path(__file__).resolve().parents[1] / "src" +if _SRC.is_dir() and str(_SRC) not in sys.path: + sys.path.insert(0, str(_SRC)) + + +def pytest_configure(config: pytest.Config): + os.environ["OTEL_SEMCONV_STABILITY_OPT_IN"] = "gen_ai_latest_experimental" + + +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, +) + +from opentelemetry.instrumentation.a2a import A2AInstrumentor + + +@pytest.fixture(scope="function", name="span_exporter") +def fixture_span_exporter(): + exporter = InMemorySpanExporter() + yield exporter + exporter.clear() + + +@pytest.fixture(scope="function", name="tracer_provider") +def fixture_tracer_provider(span_exporter): + provider = TracerProvider() + provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + return provider + + +@pytest.fixture(scope="function") +def instrument(tracer_provider): + instrumentor = A2AInstrumentor() + instrumentor.instrument( + tracer_provider=tracer_provider, + skip_dep_check=True, + ) + yield instrumentor + instrumentor.uninstrument() From 9950c19fa77862ca180046ef2dab456c01265153 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:49:36 +0800 Subject: [PATCH 11/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py --- .../tests/test_instrumentor.py | 255 ++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py new file mode 100644 index 000000000..a0011e4d4 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py @@ -0,0 +1,255 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for A2AInstrumentor. + +Every GREEN span assertion is paired with a RED baseline proving the same +executor call produces no AGENT span when the instrumentor is inactive. +The nesting assertions prove downstream spans share the AGENT span's trace, +and the "late subclass" test proves the ``__init_subclass__`` hook catches +executors defined after ``instrument()``. +""" + +from __future__ import annotations + +import pytest + +from opentelemetry import trace as trace_api +from opentelemetry.instrumentation.a2a import ( + _GEN_AI_FRAMEWORK, + _GEN_AI_OPERATION_NAME, + _GEN_AI_SPAN_KIND, + _SPAN_KIND_AGENT, + A2AInstrumentor, +) + + +# --------------------------------------------------------------------------- +# Executor stubs (real a2a AgentExecutor subclasses) +# --------------------------------------------------------------------------- + + +def _make_executor_cls(inner_tracer_provider=None): + """Build a fresh AgentExecutor subclass each call. + + A fresh class avoids cross-test contamination of the sentinel marker on + a shared ``execute`` function object. + + ``inner_tracer_provider`` lets a test route the executor's own child span + to the same exporter as the AGENT span, so the nesting relationship can be + asserted. In production the executor's downstream spans come from whatever + global/instrumentation provider is configured; nesting is guaranteed by + context propagation from the AGENT span's ``start_as_current_span``. + """ + from a2a.server.agent_execution import AgentExecutor + + class _Exec(AgentExecutor): + def __init__(self): + self.inner_tracer = trace_api.get_tracer( + "test.inner", tracer_provider=inner_tracer_provider + ) + self.captured_input = None + + async def execute(self, context, event_queue): + # Simulate agent work that opens a nested child span. + with self.inner_tracer.start_as_current_span("agent-inner-work"): + pass + + async def cancel(self, context, event_queue): + return None + + return _Exec + + +class _FakeContext: + """Minimal RequestContext-like object.""" + + def __init__(self, user_input="hello", context_id="ctx-1", task_id="task-1"): + self._user_input = user_input + self.context_id = context_id + self.task_id = task_id + + def get_user_input(self): + return self._user_input + + +async def _run(executor, context=None): + await executor.execute(context or _FakeContext(), object()) + + +# --------------------------------------------------------------------------- +# RED: no AGENT span without instrumentation +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_red_no_agent_span_without_instrumentation( + span_exporter, tracer_provider +): + ExecCls = _make_executor_cls() + await _run(ExecCls()) + names = [s.name for s in span_exporter.get_finished_spans()] + assert "invoke_agent a2a-agent" not in names, names + + +# --------------------------------------------------------------------------- +# GREEN: AGENT span for an executor defined BEFORE instrument +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_green_agent_span_existing_subclass(instrument, span_exporter): + ExecCls = _make_executor_cls() + await _run(ExecCls()) + + spans = span_exporter.get_finished_spans() + agent_spans = [ + s + for s in spans + if s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + ] + assert agent_spans, [s.name for s in spans] + span = agent_spans[0] + assert span.attributes.get(_GEN_AI_FRAMEWORK) == "a2a" + assert span.attributes.get(_GEN_AI_OPERATION_NAME) == "invoke_agent" + assert span.attributes.get("a2a.context_id") == "ctx-1" + assert span.attributes.get("a2a.task_id") == "task-1" + + +@pytest.mark.asyncio +async def test_green_inner_work_nests_under_agent(instrument, span_exporter, tracer_provider): + # Route the executor's own child span to the same exporter so the nesting + # relationship is observable; nesting itself is via context propagation. + ExecCls = _make_executor_cls(inner_tracer_provider=tracer_provider) + await _run(ExecCls()) + + spans = span_exporter.get_finished_spans() + assert len(spans) >= 2, [s.name for s in spans] + + agent = next( + s + for s in spans + if s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + ) + inner = next(s for s in spans if s.name == "agent-inner-work") + + assert inner.parent is not None + assert inner.parent.span_id == agent.context.span_id + assert inner.context.trace_id == agent.context.trace_id + + +@pytest.mark.asyncio +async def test_green_captures_user_input(instrument, span_exporter): + ExecCls = _make_executor_cls() + await _run(ExecCls(), context=_FakeContext(user_input="what is 2+2?")) + + spans = span_exporter.get_finished_spans() + agent = next( + s + for s in spans + if s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + ) + msgs = agent.attributes.get("gen_ai.input.messages") + assert msgs is not None + assert "what is 2+2?" in msgs + + +# --------------------------------------------------------------------------- +# GREEN: AGENT span for a subclass defined AFTER instrument (init_subclass hook) +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_green_agent_span_late_subclass(instrument, span_exporter): + # Defined AFTER the instrument fixture ran -> must still be wrapped. + ExecCls = _make_executor_cls() + await _run(ExecCls()) + + names = [s.name for s in span_exporter.get_finished_spans()] + assert "invoke_agent a2a-agent" in names, names + + +# --------------------------------------------------------------------------- +# RED after uninstrument: teardown must stop AGENT span production +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_red_uninstrument_stops_agent_span( + span_exporter, tracer_provider +): + instrumentor = A2AInstrumentor() + instrumentor.instrument( + tracer_provider=tracer_provider, skip_dep_check=True + ) + ExecCls = _make_executor_cls() + await _run(ExecCls()) + assert any( + s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + for s in span_exporter.get_finished_spans() + ) + + instrumentor.uninstrument() + span_exporter.clear() + + ExecCls2 = _make_executor_cls() + await _run(ExecCls2()) + names = [s.name for s in span_exporter.get_finished_spans()] + assert "invoke_agent a2a-agent" not in names, ( + f"AGENT span still produced after uninstrument: {names}" + ) + + +# --------------------------------------------------------------------------- +# Error handling: exception in execute is recorded and re-raised +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_green_records_exception(instrument, span_exporter): + from a2a.server.agent_execution import AgentExecutor + + class _BoomExec(AgentExecutor): + async def execute(self, context, event_queue): + raise ValueError("boom") + + async def cancel(self, context, event_queue): + return None + + with pytest.raises(ValueError, match="boom"): + await _run(_BoomExec()) + + from opentelemetry.trace import StatusCode + + agent = next( + s + for s in span_exporter.get_finished_spans() + if s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + ) + assert agent.status.status_code == StatusCode.ERROR + + +# --------------------------------------------------------------------------- +# Lifecycle: double uninstrument is safe +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_double_uninstrument_safe(tracer_provider): + instrumentor = A2AInstrumentor() + instrumentor.instrument( + tracer_provider=tracer_provider, skip_dep_check=True + ) + instrumentor.uninstrument() + instrumentor.uninstrument() From dbe6dddaca6916d271d80775d59ca69589bdf31c Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:50:05 +0800 Subject: [PATCH 12/21] feat: add instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/__init__.py --- .../tests/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/__init__.py diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/__init__.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/__init__.py new file mode 100644 index 000000000..b0a6f4284 --- /dev/null +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. From da1a23bc8203256d191686042560999409ed6a04 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:50:34 +0800 Subject: [PATCH 13/21] feat: add loongsuite-distro/src/loongsuite/distro/bootstrap_registry/loongsuite_instrumentation_a2a.py --- .../loongsuite_instrumentation_a2a.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 loongsuite-distro/src/loongsuite/distro/bootstrap_registry/loongsuite_instrumentation_a2a.py diff --git a/loongsuite-distro/src/loongsuite/distro/bootstrap_registry/loongsuite_instrumentation_a2a.py b/loongsuite-distro/src/loongsuite/distro/bootstrap_registry/loongsuite_instrumentation_a2a.py new file mode 100644 index 000000000..08c2b82a9 --- /dev/null +++ b/loongsuite-distro/src/loongsuite/distro/bootstrap_registry/loongsuite_instrumentation_a2a.py @@ -0,0 +1,30 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# DO NOT EDIT. THIS FILE WAS AUTOGENERATED FROM INSTRUMENTATION PACKAGES. +# RUN `python scripts/loongsuite/generate_loongsuite_bootstrap.py` TO REGENERATE. +# +# Generated with options: +# --upstream-version: (from source) +# --loongsuite-version: (from source) + +REGISTRY = { + "source": "loongsuite", + "package": "loongsuite-instrumentation-a2a", + "instrumentation": "loongsuite-instrumentation-a2a==0.10.0.dev", + "libraries": [ + "a2a-sdk >= 0.2.0", + ], + "default": False, +} From 388485cea4d7970a9d351b9569369b46302bf83f Mon Sep 17 00:00:00 2001 From: RichardoMrMu <947676438@qq.com> Date: Tue, 22 Sep 2026 16:15:03 +0800 Subject: [PATCH 14/21] fix(a2a): satisfy ruff lint (per-file-ignores + import order/format) CI precommit failed on the new package: E402 in tests/conftest.py (imports intentionally after sys.path setup + pytest_configure), PLC0415 for lazy imports in src/tests, and I001/format. Follow the existing per-file-ignores convention used by every other loongsuite instrumentation package (PLC0415 for the package, E402+F811 for tests), and apply ruff import sorting + formatting. No behavior change; 8 tests still pass. --- .../src/opentelemetry/instrumentation/a2a/__init__.py | 6 ++++-- .../loongsuite-instrumentation-a2a/tests/conftest.py | 3 +-- .../tests/test_instrumentor.py | 9 ++++++--- pyproject.toml | 2 ++ 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py index 64c8f5eb5..94e3d1961 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py @@ -65,8 +65,8 @@ from wrapt import wrap_function_wrapper from opentelemetry import trace as trace_api -from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.a2a.package import _instruments +from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.utils import unwrap from opentelemetry.trace import SpanKind, Status, StatusCode @@ -128,7 +128,9 @@ def __init__(self, tracer): async def __call__(self, wrapped, instance, args, kwargs): context = args[0] if args else kwargs.get("context") - agent_name = type(instance).__name__ if instance is not None else _AGENT_NAME + agent_name = ( + type(instance).__name__ if instance is not None else _AGENT_NAME + ) with self._tracer.start_as_current_span( f"{_OP_INVOKE_AGENT} {_AGENT_NAME}", diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py index e56ace03d..92dee1061 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/conftest.py @@ -37,14 +37,13 @@ def pytest_configure(config: pytest.Config): os.environ["OTEL_SEMCONV_STABILITY_OPT_IN"] = "gen_ai_latest_experimental" +from opentelemetry.instrumentation.a2a import A2AInstrumentor from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( InMemorySpanExporter, ) -from opentelemetry.instrumentation.a2a import A2AInstrumentor - @pytest.fixture(scope="function", name="span_exporter") def fixture_span_exporter(): diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py index a0011e4d4..399999f1e 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py @@ -34,7 +34,6 @@ A2AInstrumentor, ) - # --------------------------------------------------------------------------- # Executor stubs (real a2a AgentExecutor subclasses) # --------------------------------------------------------------------------- @@ -75,7 +74,9 @@ async def cancel(self, context, event_queue): class _FakeContext: """Minimal RequestContext-like object.""" - def __init__(self, user_input="hello", context_id="ctx-1", task_id="task-1"): + def __init__( + self, user_input="hello", context_id="ctx-1", task_id="task-1" + ): self._user_input = user_input self.context_id = context_id self.task_id = task_id @@ -128,7 +129,9 @@ async def test_green_agent_span_existing_subclass(instrument, span_exporter): @pytest.mark.asyncio -async def test_green_inner_work_nests_under_agent(instrument, span_exporter, tracer_provider): +async def test_green_inner_work_nests_under_agent( + instrument, span_exporter, tracer_provider +): # Route the executor's own child span to the same exporter so the nesting # relationship is observable; nesting itself is via context propagation. ExecCls = _make_executor_cls(inner_tracer_provider=tracer_provider) diff --git a/pyproject.toml b/pyproject.toml index ecd8c7fa6..58abe4592 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -178,6 +178,8 @@ ignore = [ "docs/**/*.*" = ["A001"] # The benchmark integrations in PR #200 build fake optional dependency modules # inside tests and import several optional targets lazily inside patch paths. +"instrumentation-loongsuite/loongsuite-instrumentation-a2a/**/*.py" = ["PLC0415"] +"instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/**/*.py" = ["E402", "F811"] "instrumentation-loongsuite/loongsuite-instrumentation-algotune/**/*.py" = ["PLC0415"] "instrumentation-loongsuite/loongsuite-instrumentation-algotune/tests/**/*.py" = ["E402", "F811"] "instrumentation-loongsuite/loongsuite-instrumentation-bfclv4/**/*.py" = ["PLC0415"] From 9b1c2ca0016d7a71cbb8cd49f16f09997874bdd5 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:27 +0800 Subject: [PATCH 15/21] fix(a2a): use shared GenAI util (semconv+content-capture), fail-safe telemetry, align a2a.task.* to semconv-genai#195 (#28) --- .../instrumentation/a2a/__init__.py | 221 ++++++++++++------ 1 file changed, 149 insertions(+), 72 deletions(-) diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py index 94e3d1961..19a137f0d 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/src/opentelemetry/instrumentation/a2a/__init__.py @@ -17,11 +17,25 @@ Produces an ARMS gen-ai **AGENT** span around each server-side agent turn of the official A2A Python SDK (``a2a-sdk``). The span brackets the user's -``AgentExecutor.execute`` invocation, so all work the agent does — including +``AgentExecutor.execute`` invocation, so all work the agent does -- including the SDK's own transport / request-handler spans and any downstream LLM / -tool instrumentation — nests underneath a single ``invoke_agent`` span with a +tool instrumentation -- nests underneath a single ``invoke_agent`` span with a shared trace id. +Scope: agent execution, not the A2A protocol +-------------------------------------------- +This package instruments the **agent execution boundary** only. It deliberately +does *not* try to model the A2A wire protocol (client/server method spans such +as ``SendMessage`` / ``GetTask``); that belongs in a dedicated protocol +instrumentation and can follow separately, tracking the A2A semantic +conventions under discussion in +https://github.com/open-telemetry/semantic-conventions-genai/pull/195. + +Where that draft already names stable protocol context that is cheaply +available at the execution boundary (the task id and task state), we attach it +to the AGENT span using the draft's ``a2a.*`` keys, so the execution span can +be correlated with protocol telemetry without pretending to be a protocol span. + Relationship to a2a-sdk's built-in tracing ------------------------------------------ ``a2a-sdk`` already ships an OpenTelemetry tracing layer @@ -30,11 +44,7 @@ spans describe the *protocol plumbing*; none of them carry gen-ai semantic conventions and none of them wraps the user's ``execute`` implementation (``AgentExecutor.execute`` is an abstract method the application overrides). - -This package is therefore **complementary, not duplicative**: it adds the -gen-ai AGENT boundary that the SDK does not, mirroring how the sibling -``loongsuite`` packages layer ARMS gen-ai spans over frameworks that already -emit some telemetry (e.g. litellm). +This package is therefore complementary, not duplicative. Instrumentation seam -------------------- @@ -52,14 +62,15 @@ Content capture --------------- -The user's input message is recorded as ``gen_ai.input.messages`` when -available. Set ``OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT=false`` to suppress -message content while keeping the structural AGENT span. +The user's input message is recorded as ``gen_ai.input.messages`` only when the +shared GenAI util's content-capture switch enables span content -- i.e. when +``OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT`` is ``SPAN_ONLY`` or +``SPAN_AND_EVENT``. An absent or invalid value defaults to ``NO_CONTENT`` (no +message content), consistent with every other loongsuite instrumentation. """ import json import logging -import os from typing import Any, Collection, Optional from wrapt import wrap_function_wrapper @@ -69,29 +80,56 @@ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor from opentelemetry.instrumentation.utils import unwrap from opentelemetry.trace import SpanKind, Status, StatusCode +from opentelemetry.util.genai.extended_semconv.gen_ai_extended_attributes import ( + GEN_AI_SPAN_KIND, + GenAiSpanKindValues, +) +from opentelemetry.util.genai.types import ContentCapturingMode +from opentelemetry.util.genai.utils import get_content_capturing_mode logger = logging.getLogger(__name__) -# ── Framework identifier ───────────────────────────────────────────────────── +# -- Framework identifier ----------------------------------------------------- _FRAMEWORK = "a2a" -_AGENT_NAME = "a2a-agent" -# ── GenAI semantic-convention attribute keys (ARMS gen-ai semconv) ─────────── -_GEN_AI_SPAN_KIND = "gen_ai.span.kind" +# -- GenAI semantic-convention attribute keys (sourced from the shared util) -- +_GEN_AI_SPAN_KIND = GEN_AI_SPAN_KIND _GEN_AI_OPERATION_NAME = "gen_ai.operation.name" _GEN_AI_FRAMEWORK = "gen_ai.framework" +_GEN_AI_AGENT_NAME = "gen_ai.agent.name" _GEN_AI_INPUT_MESSAGES = "gen_ai.input.messages" -_SPAN_KIND_AGENT = "AGENT" +_SPAN_KIND_AGENT = GenAiSpanKindValues.AGENT.value _OP_INVOKE_AGENT = "invoke_agent" -# ── Sentinel + content toggle ──────────────────────────────────────────────── +# -- A2A protocol context keys (aligned with semantic-conventions-genai #195) -- +# Only the stable task context available at the execution boundary; the full +# protocol attribute set (method.name, protocol.version, message.id, ...) is +# left to a dedicated protocol instrumentation. +_A2A_TASK_ID = "a2a.task.id" +_A2A_TASK_STATE = "a2a.task.state" +_A2A_CONTEXT_ID = "a2a.context.id" # a2a-sdk RequestContext grouping id + +# -- Sentinel ----------------------------------------------------------------- _A2A_MARKER = "_otel_a2a_wrapped" -_CAPTURE_CONTENT_ENV = "OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT" + +# Content-capture modes under which message text may be written onto spans. +_CONTENT_ON_SPAN_MODES = frozenset( + {ContentCapturingMode.SPAN_ONLY, ContentCapturingMode.SPAN_AND_EVENT} +) def _capture_content() -> bool: - return os.getenv(_CAPTURE_CONTENT_ENV, "true").lower() != "false" + """True when message content should be written onto spans. + + Delegated to the shared util so an absent/invalid + ``OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT`` defaults to + ``NO_CONTENT`` (no capture), matching the rest of loongsuite. + """ + try: + return get_content_capturing_mode() in _CONTENT_ON_SPAN_MODES + except Exception: # pragma: no cover - defensive: never break the app + return False def _text_message_json(role: str, content: Any) -> str: @@ -116,10 +154,46 @@ def _extract_user_input(context: Any) -> Optional[str]: if text: return str(text) except Exception: - pass + return None return None +def _safe_set_attributes(span: Any, context: Any, agent_name: str) -> None: + """Populate span attributes; telemetry failures must never break execution.""" + try: + span.set_attribute(_GEN_AI_SPAN_KIND, _SPAN_KIND_AGENT) + span.set_attribute(_GEN_AI_OPERATION_NAME, _OP_INVOKE_AGENT) + span.set_attribute(_GEN_AI_FRAMEWORK, _FRAMEWORK) + span.set_attribute(_GEN_AI_AGENT_NAME, agent_name) + + context_id = getattr(context, "context_id", None) + if context_id: + span.set_attribute(_A2A_CONTEXT_ID, str(context_id)) + task_id = getattr(context, "task_id", None) + if task_id: + span.set_attribute(_A2A_TASK_ID, str(task_id)) + # Task state, when the SDK exposes it on the current task. + current_task = getattr(context, "current_task", None) + task_state = getattr( + getattr(current_task, "status", None), "state", None + ) + state_value = getattr(task_state, "value", task_state) + if state_value: + span.set_attribute(_A2A_TASK_STATE, str(state_value)) + + if _capture_content(): + user_input = _extract_user_input(context) + if user_input: + span.set_attribute( + _GEN_AI_INPUT_MESSAGES, + _text_message_json("user", user_input), + ) + except Exception: # pragma: no cover - defensive: never break the app + logger.debug( + "A2A instrumentation failed to set span attributes", exc_info=True + ) + + class _ExecuteWrapper: """Wrap ``AgentExecutor.execute`` to produce the AGENT span.""" @@ -129,47 +203,35 @@ def __init__(self, tracer): async def __call__(self, wrapped, instance, args, kwargs): context = args[0] if args else kwargs.get("context") agent_name = ( - type(instance).__name__ if instance is not None else _AGENT_NAME + type(instance).__name__ if instance is not None else _FRAMEWORK ) with self._tracer.start_as_current_span( - f"{_OP_INVOKE_AGENT} {_AGENT_NAME}", + f"{_OP_INVOKE_AGENT} {agent_name}", kind=SpanKind.SERVER, ) as span: - span.set_attribute(_GEN_AI_SPAN_KIND, _SPAN_KIND_AGENT) - span.set_attribute(_GEN_AI_OPERATION_NAME, _OP_INVOKE_AGENT) - span.set_attribute(_GEN_AI_FRAMEWORK, _FRAMEWORK) - span.set_attribute("gen_ai.agent.name", agent_name) - - context_id = getattr(context, "context_id", None) - if context_id: - span.set_attribute("a2a.context_id", str(context_id)) - task_id = getattr(context, "task_id", None) - if task_id: - span.set_attribute("a2a.task_id", str(task_id)) - - if _capture_content(): - user_input = _extract_user_input(context) - if user_input: - span.set_attribute( - _GEN_AI_INPUT_MESSAGES, - _text_message_json("user", user_input), - ) + _safe_set_attributes(span, context, agent_name) try: result = await wrapped(*args, **kwargs) except Exception as e: - span.record_exception(e) - span.set_status(Status(StatusCode.ERROR)) + try: + span.record_exception(e) + span.set_status(Status(StatusCode.ERROR)) + except Exception: # pragma: no cover - defensive + pass raise - span.set_status(Status(StatusCode.OK)) + try: + span.set_status(Status(StatusCode.OK)) + except Exception: # pragma: no cover - defensive + pass return result -# ═══════════════════════════════════════════════════════════════════════════ +# =========================================================================== # Wrap / unwrap helpers -# ═══════════════════════════════════════════════════════════════════════════ +# =========================================================================== def _wrap_execute(cls, wrapper) -> None: @@ -218,9 +280,9 @@ def _iter_subclasses(base): stack.extend(cls.__subclasses__()) -# ═══════════════════════════════════════════════════════════════════════════ +# =========================================================================== # Instrumentor -# ═══════════════════════════════════════════════════════════════════════════ +# =========================================================================== class A2AInstrumentor(BaseInstrumentor): @@ -228,10 +290,17 @@ class A2AInstrumentor(BaseInstrumentor): def __init__(self): super().__init__() - self._wrapper = None - self._base = None - self._saved_init_subclass = None - self._wrapped_classes = [] + # BaseInstrumentor.__new__ returns a singleton, so __init__ may run + # again on a later A2AInstrumentor() call. Only seed the bookkeeping + # the first time, or a stray construct-after-instrument would clear the + # active hook/wrapper state and make uninstrument() a no-op. + if not hasattr(self, "_a2a_initialized"): + self._a2a_initialized = True + self._wrapper = None + self._base = None + self._saved_init_subclass = None + self._had_own_init_subclass = False + self._wrapped_classes = [] def instrumentation_dependencies(self) -> Collection[str]: return _instruments @@ -246,53 +315,61 @@ def _instrument(self, **kwargs: Any) -> None: wrapper = _ExecuteWrapper(tracer) self._wrapper = wrapper self._base = AgentExecutor + self._wrapped_classes = [] # 1) Wrap all existing subclasses. for cls in _iter_subclasses(AgentExecutor): _wrap_execute(cls, wrapper) self._wrapped_classes.append(cls) - # 2) Hook future subclasses via __init_subclass__. + # 2) Hook future subclasses via __init_subclass__. Record whether + # AgentExecutor defined its own, so uninstrument can restore exactly. + self._had_own_init_subclass = ( + "__init_subclass__" in AgentExecutor.__dict__ + ) saved = AgentExecutor.__dict__.get("__init_subclass__") self._saved_init_subclass = saved def _new_init_subclass(cls, **kw): - # Preserve any original __init_subclass__ behaviour first. - try: - if saved is not None: - saved.__func__(cls, **kw) - except Exception: # pragma: no cover - defensive - pass + if saved is not None: + # Delegate to AgentExecutor's own hook. + saved.__func__(cls, **kw) + else: + # No own hook: cooperate with the rest of the MRO instead of + # silently skipping other bases' __init_subclass__. + super(AgentExecutor, cls).__init_subclass__(**kw) _wrap_execute(cls, wrapper) AgentExecutor.__init_subclass__ = classmethod(_new_init_subclass) def _uninstrument(self, **kwargs: Any) -> None: base = self._base - # Unwrap everything we touched, plus any subclass that carries the - # sentinel (covers classes created via the __init_subclass__ hook). if base is not None: + # Unwrap everything we touched, plus any subclass carrying the + # sentinel (covers classes created via the __init_subclass__ hook). classes = set(self._wrapped_classes) classes.update(_iter_subclasses(base)) for cls in classes: _unwrap_execute(cls) - # Restore __init_subclass__. - if self._saved_init_subclass is not None: + # Restore __init_subclass__ to exactly its pre-instrument state. + if self._had_own_init_subclass: base.__init_subclass__ = self._saved_init_subclass else: - # Remove our override so it falls back to object's default. + # We added the attribute; remove it so the inherited default + # (object.__init_subclass__) is restored rather than a no-op. try: - del base.__dict__["__init_subclass__"] - except (KeyError, TypeError): - try: - base.__init_subclass__ = classmethod( - lambda cls, **kw: None - ) - except Exception: # pragma: no cover - defensive - pass + delattr(base, "__init_subclass__") + except ( + AttributeError, + TypeError, + ): # pragma: no cover - defensive + logger.debug( + "Could not restore AgentExecutor.__init_subclass__" + ) self._wrapper = None self._base = None self._saved_init_subclass = None + self._had_own_init_subclass = False self._wrapped_classes = [] From 65c2d32197b41877d319e3d0f22fe51e86bda6c4 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:31 +0800 Subject: [PATCH 16/21] test(a2a): shared content-capture default, class-based span name, fail-safe, uninstrument restore (#28) --- .../tests/test_instrumentor.py | 108 +++++++++++++++++- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py index 399999f1e..16ee6cfad 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests/test_instrumentor.py @@ -101,7 +101,7 @@ async def test_red_no_agent_span_without_instrumentation( ExecCls = _make_executor_cls() await _run(ExecCls()) names = [s.name for s in span_exporter.get_finished_spans()] - assert "invoke_agent a2a-agent" not in names, names + assert not any(n.startswith("invoke_agent ") for n in names), names # --------------------------------------------------------------------------- @@ -124,8 +124,11 @@ async def test_green_agent_span_existing_subclass(instrument, span_exporter): span = agent_spans[0] assert span.attributes.get(_GEN_AI_FRAMEWORK) == "a2a" assert span.attributes.get(_GEN_AI_OPERATION_NAME) == "invoke_agent" - assert span.attributes.get("a2a.context_id") == "ctx-1" - assert span.attributes.get("a2a.task_id") == "task-1" + assert span.attributes.get("a2a.context.id") == "ctx-1" + assert span.attributes.get("a2a.task.id") == "task-1" + # Span name uses the concrete executor class, not a constant. + assert span.name.startswith("invoke_agent ") + assert span.name != "invoke_agent a2a" @pytest.mark.asyncio @@ -153,7 +156,13 @@ async def test_green_inner_work_nests_under_agent( @pytest.mark.asyncio -async def test_green_captures_user_input(instrument, span_exporter): +async def test_green_captures_user_input( + instrument, span_exporter, monkeypatch +): + # Content is captured only when the shared util's switch opts in. + monkeypatch.setenv( + "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT", "SPAN_ONLY" + ) ExecCls = _make_executor_cls() await _run(ExecCls(), context=_FakeContext(user_input="what is 2+2?")) @@ -168,6 +177,25 @@ async def test_green_captures_user_input(instrument, span_exporter): assert "what is 2+2?" in msgs +@pytest.mark.asyncio +async def test_content_suppressed_by_default( + instrument, span_exporter, monkeypatch +): + # No capture env set -> shared util defaults to NO_CONTENT -> no message text. + monkeypatch.delenv( + "OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT", raising=False + ) + ExecCls = _make_executor_cls() + await _run(ExecCls(), context=_FakeContext(user_input="secret prompt")) + + agent = next( + s + for s in span_exporter.get_finished_spans() + if s.attributes.get(_GEN_AI_SPAN_KIND) == _SPAN_KIND_AGENT + ) + assert "gen_ai.input.messages" not in agent.attributes + + # --------------------------------------------------------------------------- # GREEN: AGENT span for a subclass defined AFTER instrument (init_subclass hook) # --------------------------------------------------------------------------- @@ -180,7 +208,7 @@ async def test_green_agent_span_late_subclass(instrument, span_exporter): await _run(ExecCls()) names = [s.name for s in span_exporter.get_finished_spans()] - assert "invoke_agent a2a-agent" in names, names + assert any(n.startswith("invoke_agent ") for n in names), names # --------------------------------------------------------------------------- @@ -209,7 +237,7 @@ async def test_red_uninstrument_stops_agent_span( ExecCls2 = _make_executor_cls() await _run(ExecCls2()) names = [s.name for s in span_exporter.get_finished_spans()] - assert "invoke_agent a2a-agent" not in names, ( + assert not any(n.startswith("invoke_agent ") for n in names), ( f"AGENT span still produced after uninstrument: {names}" ) @@ -256,3 +284,71 @@ async def test_double_uninstrument_safe(tracer_provider): ) instrumentor.uninstrument() instrumentor.uninstrument() + + +# --------------------------------------------------------------------------- +# Fail-safe: a telemetry failure must never break the agent's execution +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_telemetry_failure_does_not_break_execution( + instrument, span_exporter +): + # A context whose accessors explode simulates telemetry-side failure; the + # wrapped execute must still run to completion and return its result. + class _HostileContext: + context_id = property( + lambda self: (_ for _ in ()).throw(RuntimeError("boom")) + ) + + def get_user_input(self): + raise RuntimeError("boom") + + from a2a.server.agent_execution import AgentExecutor + + class _Exec(AgentExecutor): + async def execute(self, context, event_queue): + return "ok" + + async def cancel(self, context, event_queue): + return None + + # Must not raise despite the hostile context attribute access. + result = await _Exec().execute(_HostileContext(), object()) + assert result == "ok" + + +# --------------------------------------------------------------------------- +# Uninstrument restores AgentExecutor.__init_subclass__ (Copilot findings) +# --------------------------------------------------------------------------- + + +@pytest.mark.asyncio +async def test_uninstrument_restores_init_subclass(tracer_provider): + from a2a.server.agent_execution import AgentExecutor + + before = AgentExecutor.__dict__.get("__init_subclass__") + + instrumentor = A2AInstrumentor() + instrumentor.instrument( + tracer_provider=tracer_provider, skip_dep_check=True + ) + # While instrumented, our hook is installed. + assert AgentExecutor.__dict__.get("__init_subclass__") is not before + + instrumentor.uninstrument() + # Restored to exactly the pre-instrument state (AgentExecutor defines none + # of its own, so the attribute is removed and object's default is inherited). + after = AgentExecutor.__dict__.get("__init_subclass__") + assert after is before + + # A subclass defined now must construct cleanly (no stranded hook). + class _Late(AgentExecutor): + async def execute(self, context, event_queue): + return None + + async def cancel(self, context, event_queue): + return None + + assert _Late is not None From 786e8207feb40ffc0db769d105649a20bcd2f8bd Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:34 +0800 Subject: [PATCH 17/21] docs(a2a): shared content-capture switch + agent-vs-protocol scope note (#28) --- .../loongsuite-instrumentation-a2a/README.md | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md index 5e52befa9..9171253d8 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/README.md @@ -34,11 +34,27 @@ Instrumentation covers both `AgentExecutor` subclasses that already exist when `instrument()` is called and any defined afterwards (via an `__init_subclass__` hook installed on `AgentExecutor`). +## Scope: agent execution, not the A2A protocol + +This package instruments the **agent execution boundary** only (the +`invoke_agent` AGENT span). It does not model the A2A wire protocol +(client/server method spans such as `SendMessage` / `GetTask`); that belongs in +a dedicated protocol instrumentation and can follow separately, tracking the +[A2A semantic conventions draft](https://github.com/open-telemetry/semantic-conventions-genai/pull/195). +Where that draft already names stable protocol context available at the +execution boundary — the task id and task state — this package attaches it to +the AGENT span using the draft's `a2a.task.id` / `a2a.task.state` keys so the +execution span can be correlated with protocol telemetry. + ## Content capture -The user's input message is captured on `gen_ai.input.messages` by default. To -suppress it while keeping the structural AGENT span: +The user's input message is recorded on `gen_ai.input.messages` **only when** +content capture is explicitly enabled through the shared GenAI switch used by +every loongsuite instrumentation. An absent or invalid value defaults to +`NO_CONTENT` (no message content), so sensitive prompts are never exported +without opt-in: ```bash -export OTEL_INSTRUMENTATION_A2A_CAPTURE_CONTENT=false +# Record message content on spans (default is NO_CONTENT): +export OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=SPAN_ONLY ``` From 52facb5db9f5ce5fadebe774e1a80a77fa6e3e25 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:39 +0800 Subject: [PATCH 18/21] docs(a2a): changelog for shared-util adoption + semconv alignment (#28) --- .../loongsuite-instrumentation-a2a/CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md index 8f9cde2ab..27683f87e 100644 --- a/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md +++ b/instrumentation-loongsuite/loongsuite-instrumentation-a2a/CHANGELOG.md @@ -16,3 +16,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 future-defined executor subclasses), complementing — rather than duplicating — the SDK's built-in transport/request-handler tracing. ([#28](https://github.com/alibaba/loongsuite-python/issues/28)) +- Span kind and content-capture are sourced from the shared GenAI util + (`opentelemetry-util-genai`): the span kind comes from `GenAiSpanKindValues` + and content capture is governed by the standard + `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` switch (default + `NO_CONTENT`), so user prompts are never exported without explicit opt-in. +- Task context available at the execution boundary is attached using the A2A + semantic-conventions draft keys `a2a.task.id` / `a2a.task.state` + ([semantic-conventions-genai#195](https://github.com/open-telemetry/semantic-conventions-genai/pull/195)), + keeping agent execution distinct from A2A protocol operations; full protocol + instrumentation can follow separately. +- Telemetry is fail-safe: any error while recording span attributes is + swallowed so instrumentation can never interrupt agent execution. +- The AGENT span name uses the concrete executor class + (`invoke_agent {ClassName}`), matching sibling agent instrumentations. From 55030ab3d00bb465f50ee4e21275421796a9a260 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:44 +0800 Subject: [PATCH 19/21] ci(a2a): register test/lint envs in tox-loongsuite (#28) --- tox-loongsuite.ini | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tox-loongsuite.ini b/tox-loongsuite.ini index 3906e904d..455c43ccb 100644 --- a/tox-loongsuite.ini +++ b/tox-loongsuite.ini @@ -103,6 +103,10 @@ envlist = py3{10,11,12,13}-test-loongsuite-instrumentation-crewai lint-loongsuite-instrumentation-crewai + ; loongsuite-instrumentation-a2a + py3{10,11,12,13}-test-loongsuite-instrumentation-a2a + lint-loongsuite-instrumentation-a2a + ; loongsuite-instrumentation-qwenpaw py3{11,12,13}-test-loongsuite-instrumentation-qwenpaw-latest py3{10,11,12,13}-test-loongsuite-instrumentation-qwenpaw-{v1,legacy} @@ -250,6 +254,9 @@ deps = crewai: -r {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-crewai/tests/test-requirements.txt + a2a: {[testenv]test_deps} + a2a: -r {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-a2a/test-requirements.txt + qwenpaw-latest: -r {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-qwenpaw/tests/requirements.latest.txt qwenpaw-v1: -r {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-qwenpaw/tests/requirements.v1.txt qwenpaw-legacy: -r {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-qwenpaw/tests/requirements.oldest.txt @@ -365,6 +372,8 @@ commands = test-loongsuite-instrumentation-crewai: pytest {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-crewai/tests {posargs} lint-loongsuite-instrumentation-crewai: python -m ruff check {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-crewai + test-loongsuite-instrumentation-a2a: pytest {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-a2a/tests {posargs} + lint-loongsuite-instrumentation-a2a: python -m ruff check {toxinidir}/instrumentation-loongsuite/loongsuite-instrumentation-a2a test-util-genai: pytest {toxinidir}/util/opentelemetry-util-genai/tests {posargs} lint-util-genai: sh -c "cd util && pylint --rcfile ../.pylintrc opentelemetry-util-genai" From 267dc3170458c661c6bd975ddf673598f70def11 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:49 +0800 Subject: [PATCH 20/21] ci(a2a): regenerate loongsuite test workflow matrix (#28) --- .github/workflows/loongsuite_test_0.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/loongsuite_test_0.yml b/.github/workflows/loongsuite_test_0.yml index 092a82805..8cfcee850 100644 --- a/.github/workflows/loongsuite_test_0.yml +++ b/.github/workflows/loongsuite_test_0.yml @@ -84,7 +84,7 @@ jobs: shell: bash env: LOONGSUITE_ALL_JOBS: >- - [{"name": "py310-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.13 ARC"}, {"name": "py39-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.9", "tox_env": "py39-test-util-genai", "ui_name": "util-genai 3.9 ARC"}, {"name": "py310-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.10", "tox_env": "py310-test-util-genai", "ui_name": "util-genai 3.10 ARC"}, {"name": "py311-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.11", "tox_env": "py311-test-util-genai", "ui_name": "util-genai 3.11 ARC"}, {"name": "py312-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.12", "tox_env": "py312-test-util-genai", "ui_name": "util-genai 3.12 ARC"}, {"name": "py313-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.13", "tox_env": "py313-test-util-genai", "ui_name": "util-genai 3.13 ARC"}, {"name": "py314-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.14", "tox_env": "py314-test-util-genai", "ui_name": "util-genai 3.14 ARC"}, {"name": "pypy3-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "pypy-3.9", "tox_env": "pypy3-test-util-genai", "ui_name": "util-genai pypy-3.9 ARC"}, {"name": "py311-test-detect-loongsuite-changes_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "detect-loongsuite-changes", "python_version": "3.11", "tox_env": "py311-test-detect-loongsuite-changes", "ui_name": "detect-loongsuite-changes 3.11 ARC"}, {"name": "py310-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.13 ARC"}, {"name": "py39-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.9", "tox_env": "py39-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.9 ARC"}, {"name": "py310-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.10", "tox_env": "py310-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.10 ARC"}, {"name": "py311-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.11", "tox_env": "py311-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.11 ARC"}, {"name": "py312-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.12", "tox_env": "py312-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.12 ARC"}, {"name": "py313-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.13", "tox_env": "py313-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.13 ARC"}] + [{"name": "py310-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agentscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agentscope-oldest", "ui_name": "loongsuite-instrumentation-agentscope-oldest 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agentscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agentscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agentscope-latest", "ui_name": "loongsuite-instrumentation-agentscope-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-dashscope-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-dashscope-oldest", "ui_name": "loongsuite-instrumentation-dashscope-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-dashscope-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-dashscope", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-dashscope-latest", "ui_name": "loongsuite-instrumentation-dashscope-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claude-agent-sdk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claude-agent-sdk-oldest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claude-agent-sdk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claude-agent-sdk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claude-agent-sdk-latest", "ui_name": "loongsuite-instrumentation-claude-agent-sdk-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-adk-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-adk-oldest", "ui_name": "loongsuite-instrumentation-google-adk-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-adk-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-adk", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-adk-latest", "ui_name": "loongsuite-instrumentation-google-adk-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-genai-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-genai-oldest", "ui_name": "loongsuite-instrumentation-google-genai-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-google-genai-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-google-genai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-google-genai-latest", "ui_name": "loongsuite-instrumentation-google-genai-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-agno_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-agno", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langchain-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langchain-oldest", "ui_name": "loongsuite-instrumentation-langchain-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langchain-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langchain", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langchain-latest", "ui_name": "loongsuite-instrumentation-langchain-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langgraph-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langgraph-oldest", "ui_name": "loongsuite-instrumentation-langgraph-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-langgraph-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-langgraph", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-langgraph-latest", "ui_name": "loongsuite-instrumentation-langgraph-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-autogen_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-autogen", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-deepagents-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-deepagents", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-deepagents-latest", "ui_name": "loongsuite-instrumentation-deepagents-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-microsoft-agent-framework_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-microsoft-agent-framework", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-strands-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-strands-oldest", "ui_name": "loongsuite-instrumentation-strands-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-strands-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-strands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-strands-latest", "ui_name": "loongsuite-instrumentation-strands-latest 3.13 ARC"}, {"name": "py39-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.9 ARC"}, {"name": "py39-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.9", "tox_env": "py39-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.9 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwen-agent-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwen-agent-oldest", "ui_name": "loongsuite-instrumentation-qwen-agent-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwen-agent-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwen-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwen-agent-latest", "ui_name": "loongsuite-instrumentation-qwen-agent-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-hermes-agent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-hermes-agent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-mem0-oldest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-mem0-oldest", "ui_name": "loongsuite-instrumentation-mem0-oldest 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-mem0-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-mem0", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-mem0-latest", "ui_name": "loongsuite-instrumentation-mem0-latest 3.13 ARC"}, {"name": "py39-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.9", "tox_env": "py39-test-util-genai", "ui_name": "util-genai 3.9 ARC"}, {"name": "py310-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.10", "tox_env": "py310-test-util-genai", "ui_name": "util-genai 3.10 ARC"}, {"name": "py311-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.11", "tox_env": "py311-test-util-genai", "ui_name": "util-genai 3.11 ARC"}, {"name": "py312-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.12", "tox_env": "py312-test-util-genai", "ui_name": "util-genai 3.12 ARC"}, {"name": "py313-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.13", "tox_env": "py313-test-util-genai", "ui_name": "util-genai 3.13 ARC"}, {"name": "py314-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "3.14", "tox_env": "py314-test-util-genai", "ui_name": "util-genai 3.14 ARC"}, {"name": "pypy3-test-util-genai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "util-genai", "python_version": "pypy-3.9", "tox_env": "pypy3-test-util-genai", "ui_name": "util-genai pypy-3.9 ARC"}, {"name": "py311-test-detect-loongsuite-changes_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "detect-loongsuite-changes", "python_version": "3.11", "tox_env": "py311-test-detect-loongsuite-changes", "ui_name": "detect-loongsuite-changes 3.11 ARC"}, {"name": "py310-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-litellm_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-litellm", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-crewai_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-crewai", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-a2a_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-a2a", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-a2a", "ui_name": "loongsuite-instrumentation-a2a 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-a2a_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-a2a", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-a2a", "ui_name": "loongsuite-instrumentation-a2a 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-a2a_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-a2a", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-a2a", "ui_name": "loongsuite-instrumentation-a2a 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-a2a_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-a2a", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-a2a", "ui_name": "loongsuite-instrumentation-a2a 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-latest_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-latest", "ui_name": "loongsuite-instrumentation-qwenpaw-latest 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.10 ARC"}, {"name": "py310-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.11 ARC"}, {"name": "py311-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.12 ARC"}, {"name": "py312-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-v1_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-v1", "ui_name": "loongsuite-instrumentation-qwenpaw-v1 3.13 ARC"}, {"name": "py313-test-loongsuite-instrumentation-qwenpaw-legacy_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-qwenpaw", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-qwenpaw-legacy", "ui_name": "loongsuite-instrumentation-qwenpaw-legacy 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-algotune_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-algotune", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-bfclv4_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-bfclv4", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-claw-eval_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-claw-eval", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-minisweagent_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-minisweagent", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-openhands_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-openhands", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-slop-code_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-slop-code", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-terminus2_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-terminus2", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-vita_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-vita", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-webarena_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-webarena", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena 3.13 ARC"}, {"name": "py311-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-widesearch_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-widesearch", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch 3.13 ARC"}, {"name": "py310-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.10", "tox_env": "py310-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.10 ARC"}, {"name": "py311-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.11", "tox_env": "py311-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.11 ARC"}, {"name": "py312-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.12", "tox_env": "py312-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.12 ARC"}, {"name": "py313-test-loongsuite-instrumentation-wildtool_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-instrumentation-wildtool", "python_version": "3.13", "tox_env": "py313-test-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool 3.13 ARC"}, {"name": "py39-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.9", "tox_env": "py39-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.9 ARC"}, {"name": "py310-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.10", "tox_env": "py310-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.10 ARC"}, {"name": "py311-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.11", "tox_env": "py311-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.11 ARC"}, {"name": "py312-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.12", "tox_env": "py312-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.12 ARC"}, {"name": "py313-test-loongsuite-distro_loongsuite-python-arc", "os": "loongsuite-python-arc", "package": "loongsuite-distro", "python_version": "3.13", "tox_env": "py313-test-loongsuite-distro", "ui_name": "loongsuite-distro 3.13 ARC"}] LOONGSUITE_FULL: ${{ steps.detect.outputs.full }} LOONGSUITE_PACKAGES: ${{ steps.detect.outputs.packages }} run: | From 65b146e467c3a850e7233a61fee67577014367e7 Mon Sep 17 00:00:00 2001 From: RichardoMu <44485717+RichardoMrMu@users.noreply.github.com> Date: Thu, 24 Sep 2026 00:37:53 +0800 Subject: [PATCH 21/21] ci(a2a): regenerate loongsuite lint workflow matrix (#28) --- .github/workflows/loongsuite_lint_0.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/loongsuite_lint_0.yml b/.github/workflows/loongsuite_lint_0.yml index dad9eff2a..b3bafba57 100644 --- a/.github/workflows/loongsuite_lint_0.yml +++ b/.github/workflows/loongsuite_lint_0.yml @@ -84,7 +84,7 @@ jobs: shell: bash env: LOONGSUITE_ALL_JOBS: >- - [{"name": "lint-loongsuite-instrumentation-agentscope", "package": "loongsuite-instrumentation-agentscope", "tox_env": "lint-loongsuite-instrumentation-agentscope", "ui_name": "loongsuite-instrumentation-agentscope"}, {"name": "lint-loongsuite-instrumentation-dashscope", "package": "loongsuite-instrumentation-dashscope", "tox_env": "lint-loongsuite-instrumentation-dashscope", "ui_name": "loongsuite-instrumentation-dashscope"}, {"name": "lint-loongsuite-instrumentation-claude-agent-sdk", "package": "loongsuite-instrumentation-claude-agent-sdk", "tox_env": "lint-loongsuite-instrumentation-claude-agent-sdk", "ui_name": "loongsuite-instrumentation-claude-agent-sdk"}, {"name": "lint-loongsuite-instrumentation-google-adk", "package": "loongsuite-instrumentation-google-adk", "tox_env": "lint-loongsuite-instrumentation-google-adk", "ui_name": "loongsuite-instrumentation-google-adk"}, {"name": "lint-loongsuite-instrumentation-google-genai", "package": "loongsuite-instrumentation-google-genai", "tox_env": "lint-loongsuite-instrumentation-google-genai", "ui_name": "loongsuite-instrumentation-google-genai"}, {"name": "lint-loongsuite-instrumentation-agno", "package": "loongsuite-instrumentation-agno", "tox_env": "lint-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno"}, {"name": "lint-loongsuite-instrumentation-langchain", "package": "loongsuite-instrumentation-langchain", "tox_env": "lint-loongsuite-instrumentation-langchain", "ui_name": "loongsuite-instrumentation-langchain"}, {"name": "lint-loongsuite-instrumentation-langgraph", "package": "loongsuite-instrumentation-langgraph", "tox_env": "lint-loongsuite-instrumentation-langgraph", "ui_name": "loongsuite-instrumentation-langgraph"}, {"name": "lint-loongsuite-instrumentation-autogen", "package": "loongsuite-instrumentation-autogen", "tox_env": "lint-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen"}, {"name": "lint-loongsuite-instrumentation-deepagents", "package": "loongsuite-instrumentation-deepagents", "tox_env": "lint-loongsuite-instrumentation-deepagents", "ui_name": "loongsuite-instrumentation-deepagents"}, {"name": "lint-loongsuite-instrumentation-microsoft-agent-framework", "package": "loongsuite-instrumentation-microsoft-agent-framework", "tox_env": "lint-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework"}, {"name": "lint-loongsuite-instrumentation-strands", "package": "loongsuite-instrumentation-strands", "tox_env": "lint-loongsuite-instrumentation-strands", "ui_name": "loongsuite-instrumentation-strands"}, {"name": "lint-loongsuite-instrumentation-qwen-agent", "package": "loongsuite-instrumentation-qwen-agent", "tox_env": "lint-loongsuite-instrumentation-qwen-agent", "ui_name": "loongsuite-instrumentation-qwen-agent"}, {"name": "lint-loongsuite-instrumentation-hermes-agent", "package": "loongsuite-instrumentation-hermes-agent", "tox_env": "lint-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent"}, {"name": "lint-loongsuite-instrumentation-mem0", "package": "loongsuite-instrumentation-mem0", "tox_env": "lint-loongsuite-instrumentation-mem0", "ui_name": "loongsuite-instrumentation-mem0"}, {"name": "lint-util-genai", "package": "util-genai", "tox_env": "lint-util-genai", "ui_name": "util-genai"}, {"name": "lint-loongsuite-instrumentation-litellm", "package": "loongsuite-instrumentation-litellm", "tox_env": "lint-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm"}, {"name": "lint-loongsuite-instrumentation-crewai", "package": "loongsuite-instrumentation-crewai", "tox_env": "lint-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai"}, {"name": "lint-loongsuite-instrumentation-qwenpaw", "package": "loongsuite-instrumentation-qwenpaw", "tox_env": "lint-loongsuite-instrumentation-qwenpaw", "ui_name": "loongsuite-instrumentation-qwenpaw"}, {"name": "lint-loongsuite-instrumentation-algotune", "package": "loongsuite-instrumentation-algotune", "tox_env": "lint-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune"}, {"name": "lint-loongsuite-instrumentation-bfclv4", "package": "loongsuite-instrumentation-bfclv4", "tox_env": "lint-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4"}, {"name": "lint-loongsuite-instrumentation-claw-eval", "package": "loongsuite-instrumentation-claw-eval", "tox_env": "lint-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval"}, {"name": "lint-loongsuite-instrumentation-minisweagent", "package": "loongsuite-instrumentation-minisweagent", "tox_env": "lint-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent"}, {"name": "lint-loongsuite-instrumentation-openhands", "package": "loongsuite-instrumentation-openhands", "tox_env": "lint-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands"}, {"name": "lint-loongsuite-instrumentation-slop-code", "package": "loongsuite-instrumentation-slop-code", "tox_env": "lint-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code"}, {"name": "lint-loongsuite-instrumentation-terminus2", "package": "loongsuite-instrumentation-terminus2", "tox_env": "lint-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2"}, {"name": "lint-loongsuite-instrumentation-vita", "package": "loongsuite-instrumentation-vita", "tox_env": "lint-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita"}, {"name": "lint-loongsuite-instrumentation-webarena", "package": "loongsuite-instrumentation-webarena", "tox_env": "lint-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena"}, {"name": "lint-loongsuite-instrumentation-widesearch", "package": "loongsuite-instrumentation-widesearch", "tox_env": "lint-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch"}, {"name": "lint-loongsuite-instrumentation-wildtool", "package": "loongsuite-instrumentation-wildtool", "tox_env": "lint-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool"}] + [{"name": "lint-loongsuite-instrumentation-agentscope", "package": "loongsuite-instrumentation-agentscope", "tox_env": "lint-loongsuite-instrumentation-agentscope", "ui_name": "loongsuite-instrumentation-agentscope"}, {"name": "lint-loongsuite-instrumentation-dashscope", "package": "loongsuite-instrumentation-dashscope", "tox_env": "lint-loongsuite-instrumentation-dashscope", "ui_name": "loongsuite-instrumentation-dashscope"}, {"name": "lint-loongsuite-instrumentation-claude-agent-sdk", "package": "loongsuite-instrumentation-claude-agent-sdk", "tox_env": "lint-loongsuite-instrumentation-claude-agent-sdk", "ui_name": "loongsuite-instrumentation-claude-agent-sdk"}, {"name": "lint-loongsuite-instrumentation-google-adk", "package": "loongsuite-instrumentation-google-adk", "tox_env": "lint-loongsuite-instrumentation-google-adk", "ui_name": "loongsuite-instrumentation-google-adk"}, {"name": "lint-loongsuite-instrumentation-google-genai", "package": "loongsuite-instrumentation-google-genai", "tox_env": "lint-loongsuite-instrumentation-google-genai", "ui_name": "loongsuite-instrumentation-google-genai"}, {"name": "lint-loongsuite-instrumentation-agno", "package": "loongsuite-instrumentation-agno", "tox_env": "lint-loongsuite-instrumentation-agno", "ui_name": "loongsuite-instrumentation-agno"}, {"name": "lint-loongsuite-instrumentation-langchain", "package": "loongsuite-instrumentation-langchain", "tox_env": "lint-loongsuite-instrumentation-langchain", "ui_name": "loongsuite-instrumentation-langchain"}, {"name": "lint-loongsuite-instrumentation-langgraph", "package": "loongsuite-instrumentation-langgraph", "tox_env": "lint-loongsuite-instrumentation-langgraph", "ui_name": "loongsuite-instrumentation-langgraph"}, {"name": "lint-loongsuite-instrumentation-autogen", "package": "loongsuite-instrumentation-autogen", "tox_env": "lint-loongsuite-instrumentation-autogen", "ui_name": "loongsuite-instrumentation-autogen"}, {"name": "lint-loongsuite-instrumentation-deepagents", "package": "loongsuite-instrumentation-deepagents", "tox_env": "lint-loongsuite-instrumentation-deepagents", "ui_name": "loongsuite-instrumentation-deepagents"}, {"name": "lint-loongsuite-instrumentation-microsoft-agent-framework", "package": "loongsuite-instrumentation-microsoft-agent-framework", "tox_env": "lint-loongsuite-instrumentation-microsoft-agent-framework", "ui_name": "loongsuite-instrumentation-microsoft-agent-framework"}, {"name": "lint-loongsuite-instrumentation-strands", "package": "loongsuite-instrumentation-strands", "tox_env": "lint-loongsuite-instrumentation-strands", "ui_name": "loongsuite-instrumentation-strands"}, {"name": "lint-loongsuite-instrumentation-qwen-agent", "package": "loongsuite-instrumentation-qwen-agent", "tox_env": "lint-loongsuite-instrumentation-qwen-agent", "ui_name": "loongsuite-instrumentation-qwen-agent"}, {"name": "lint-loongsuite-instrumentation-hermes-agent", "package": "loongsuite-instrumentation-hermes-agent", "tox_env": "lint-loongsuite-instrumentation-hermes-agent", "ui_name": "loongsuite-instrumentation-hermes-agent"}, {"name": "lint-loongsuite-instrumentation-mem0", "package": "loongsuite-instrumentation-mem0", "tox_env": "lint-loongsuite-instrumentation-mem0", "ui_name": "loongsuite-instrumentation-mem0"}, {"name": "lint-util-genai", "package": "util-genai", "tox_env": "lint-util-genai", "ui_name": "util-genai"}, {"name": "lint-loongsuite-instrumentation-litellm", "package": "loongsuite-instrumentation-litellm", "tox_env": "lint-loongsuite-instrumentation-litellm", "ui_name": "loongsuite-instrumentation-litellm"}, {"name": "lint-loongsuite-instrumentation-crewai", "package": "loongsuite-instrumentation-crewai", "tox_env": "lint-loongsuite-instrumentation-crewai", "ui_name": "loongsuite-instrumentation-crewai"}, {"name": "lint-loongsuite-instrumentation-a2a", "package": "loongsuite-instrumentation-a2a", "tox_env": "lint-loongsuite-instrumentation-a2a", "ui_name": "loongsuite-instrumentation-a2a"}, {"name": "lint-loongsuite-instrumentation-qwenpaw", "package": "loongsuite-instrumentation-qwenpaw", "tox_env": "lint-loongsuite-instrumentation-qwenpaw", "ui_name": "loongsuite-instrumentation-qwenpaw"}, {"name": "lint-loongsuite-instrumentation-algotune", "package": "loongsuite-instrumentation-algotune", "tox_env": "lint-loongsuite-instrumentation-algotune", "ui_name": "loongsuite-instrumentation-algotune"}, {"name": "lint-loongsuite-instrumentation-bfclv4", "package": "loongsuite-instrumentation-bfclv4", "tox_env": "lint-loongsuite-instrumentation-bfclv4", "ui_name": "loongsuite-instrumentation-bfclv4"}, {"name": "lint-loongsuite-instrumentation-claw-eval", "package": "loongsuite-instrumentation-claw-eval", "tox_env": "lint-loongsuite-instrumentation-claw-eval", "ui_name": "loongsuite-instrumentation-claw-eval"}, {"name": "lint-loongsuite-instrumentation-minisweagent", "package": "loongsuite-instrumentation-minisweagent", "tox_env": "lint-loongsuite-instrumentation-minisweagent", "ui_name": "loongsuite-instrumentation-minisweagent"}, {"name": "lint-loongsuite-instrumentation-openhands", "package": "loongsuite-instrumentation-openhands", "tox_env": "lint-loongsuite-instrumentation-openhands", "ui_name": "loongsuite-instrumentation-openhands"}, {"name": "lint-loongsuite-instrumentation-slop-code", "package": "loongsuite-instrumentation-slop-code", "tox_env": "lint-loongsuite-instrumentation-slop-code", "ui_name": "loongsuite-instrumentation-slop-code"}, {"name": "lint-loongsuite-instrumentation-terminus2", "package": "loongsuite-instrumentation-terminus2", "tox_env": "lint-loongsuite-instrumentation-terminus2", "ui_name": "loongsuite-instrumentation-terminus2"}, {"name": "lint-loongsuite-instrumentation-vita", "package": "loongsuite-instrumentation-vita", "tox_env": "lint-loongsuite-instrumentation-vita", "ui_name": "loongsuite-instrumentation-vita"}, {"name": "lint-loongsuite-instrumentation-webarena", "package": "loongsuite-instrumentation-webarena", "tox_env": "lint-loongsuite-instrumentation-webarena", "ui_name": "loongsuite-instrumentation-webarena"}, {"name": "lint-loongsuite-instrumentation-widesearch", "package": "loongsuite-instrumentation-widesearch", "tox_env": "lint-loongsuite-instrumentation-widesearch", "ui_name": "loongsuite-instrumentation-widesearch"}, {"name": "lint-loongsuite-instrumentation-wildtool", "package": "loongsuite-instrumentation-wildtool", "tox_env": "lint-loongsuite-instrumentation-wildtool", "ui_name": "loongsuite-instrumentation-wildtool"}] LOONGSUITE_FULL: ${{ steps.detect.outputs.full }} LOONGSUITE_PACKAGES: ${{ steps.detect.outputs.packages }} run: |