diff --git a/.github/component_owners.yml b/.github/component_owners.yml index 25a0a06e4b..37eb0418b3 100644 --- a/.github/component_owners.yml +++ b/.github/component_owners.yml @@ -60,3 +60,6 @@ components: - vasantteja - anirudha - MikeGoldsmith + + instrumentation-genai/opentelemetry-instrumentation-cohere: + - Nik-Reddy diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 6bf3c631cd..acd91e46d6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -119,6 +119,25 @@ jobs: - name: Run tests run: tox -e lint-instrumentation-anthropic + lint-instrumentation-cohere: + name: instrumentation-cohere + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e lint-instrumentation-cohere + lint-instrumentation-claude-agent-sdk: name: instrumentation-claude-agent-sdk runs-on: ubuntu-latest diff --git a/.github/workflows/package-prepare-patch-release.yml b/.github/workflows/package-prepare-patch-release.yml index 5ad5615978..67a4a1336c 100644 --- a/.github/workflows/package-prepare-patch-release.yml +++ b/.github/workflows/package-prepare-patch-release.yml @@ -13,6 +13,7 @@ on: - opentelemetry-instrumentation-openai-agents-v2 - opentelemetry-instrumentation-vertexai - opentelemetry-instrumentation-anthropic + - opentelemetry-instrumentation-cohere - opentelemetry-instrumentation-claude-agent-sdk - opentelemetry-instrumentation-google-genai - opentelemetry-util-genai diff --git a/.github/workflows/package-prepare-release.yml b/.github/workflows/package-prepare-release.yml index f9819d3668..c578d4f117 100644 --- a/.github/workflows/package-prepare-release.yml +++ b/.github/workflows/package-prepare-release.yml @@ -13,6 +13,7 @@ on: - opentelemetry-instrumentation-openai-agents-v2 - opentelemetry-instrumentation-vertexai - opentelemetry-instrumentation-anthropic + - opentelemetry-instrumentation-cohere - opentelemetry-instrumentation-claude-agent-sdk - opentelemetry-instrumentation-google-genai - opentelemetry-util-genai diff --git a/.github/workflows/package-release.yml b/.github/workflows/package-release.yml index 3ab6341b55..9c45094497 100644 --- a/.github/workflows/package-release.yml +++ b/.github/workflows/package-release.yml @@ -13,6 +13,7 @@ on: - opentelemetry-instrumentation-openai-agents-v2 - opentelemetry-instrumentation-vertexai - opentelemetry-instrumentation-anthropic + - opentelemetry-instrumentation-cohere - opentelemetry-instrumentation-claude-agent-sdk - opentelemetry-instrumentation-google-genai - opentelemetry-util-genai diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9c694007ea..0d91df7a6c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1031,6 +1031,198 @@ jobs: - name: Run tests run: tox -e py314-test-instrumentation-anthropic-latest -- -ra + + + py310-test-instrumentation-cohere-oldest_ubuntu-latest: + name: instrumentation-cohere-oldest 3.10 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py310-test-instrumentation-cohere-oldest -- -ra + + py310-test-instrumentation-cohere-latest_ubuntu-latest: + name: instrumentation-cohere-latest 3.10 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py310-test-instrumentation-cohere-latest -- -ra + + py311-test-instrumentation-cohere-oldest_ubuntu-latest: + name: instrumentation-cohere-oldest 3.11 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py311-test-instrumentation-cohere-oldest -- -ra + + py311-test-instrumentation-cohere-latest_ubuntu-latest: + name: instrumentation-cohere-latest 3.11 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py311-test-instrumentation-cohere-latest -- -ra + + py312-test-instrumentation-cohere-oldest_ubuntu-latest: + name: instrumentation-cohere-oldest 3.12 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py312-test-instrumentation-cohere-oldest -- -ra + + py312-test-instrumentation-cohere-latest_ubuntu-latest: + name: instrumentation-cohere-latest 3.12 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py312-test-instrumentation-cohere-latest -- -ra + + py313-test-instrumentation-cohere-oldest_ubuntu-latest: + name: instrumentation-cohere-oldest 3.13 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.13 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py313-test-instrumentation-cohere-oldest -- -ra + + py313-test-instrumentation-cohere-latest_ubuntu-latest: + name: instrumentation-cohere-latest 3.13 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.13 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py313-test-instrumentation-cohere-latest -- -ra + + py314-test-instrumentation-cohere-oldest_ubuntu-latest: + name: instrumentation-cohere-oldest 3.14 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314-test-instrumentation-cohere-oldest -- -ra + + py314-test-instrumentation-cohere-latest_ubuntu-latest: + name: instrumentation-cohere-latest 3.14 Ubuntu + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout repo @ SHA - ${{ github.sha }} + uses: actions/checkout@v4 + + - name: Set up Python 3.14 + uses: actions/setup-python@v5 + with: + python-version: "3.14" + + - name: Install tox + run: pip install tox-uv + + - name: Run tests + run: tox -e py314-test-instrumentation-cohere-latest -- -ra + py310-test-instrumentation-claude-agent-sdk-oldest_ubuntu-latest: name: instrumentation-claude-agent-sdk-oldest 3.10 Ubuntu runs-on: ubuntu-latest diff --git a/RELEASING.md b/RELEASING.md index b5dfb41922..3710f9de15 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -26,6 +26,7 @@ > - opentelemetry-instrumentation-openai-agents-v2 > - opentelemetry-instrumentation-vertexai > - opentelemetry-instrumentation-anthropic +> - opentelemetry-instrumentation-cohere > - opentelemetry-instrumentation-claude-agent-sdk > - opentelemetry-instrumentation-google-genai > - opentelemetry-instrumentation-langchain @@ -107,6 +108,7 @@ The workflow will create a pull request that should be merged in order to procee > - opentelemetry-instrumentation-openai-agents-v2 > - opentelemetry-instrumentation-vertexai > - opentelemetry-instrumentation-anthropic +> - opentelemetry-instrumentation-cohere > - opentelemetry-instrumentation-claude-agent-sdk > - opentelemetry-instrumentation-google-genai > - opentelemetry-instrumentation-langchain diff --git a/instrumentation-genai/README.md b/instrumentation-genai/README.md index dbe51b523e..78fa4bd58d 100644 --- a/instrumentation-genai/README.md +++ b/instrumentation-genai/README.md @@ -3,6 +3,7 @@ | --------------- | ------------------ | --------------- | -------------- | | [opentelemetry-instrumentation-anthropic](./opentelemetry-instrumentation-anthropic) | anthropic >= 0.16.0 | No | development | [opentelemetry-instrumentation-claude-agent-sdk](./opentelemetry-instrumentation-claude-agent-sdk) | claude-agent-sdk >= 0.1.14 | No | development +| [opentelemetry-instrumentation-cohere](./opentelemetry-instrumentation-cohere) | cohere >= 5.0.0 | No | development | [opentelemetry-instrumentation-google-genai](./opentelemetry-instrumentation-google-genai) | google-genai >= 1.32.0 | No | development | [opentelemetry-instrumentation-langchain](./opentelemetry-instrumentation-langchain) | langchain >= 0.3.21 | No | development | [opentelemetry-instrumentation-openai-agents-v2](./opentelemetry-instrumentation-openai-agents-v2) | openai-agents >= 0.3.3 | No | development diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/CHANGELOG.md b/instrumentation-genai/opentelemetry-instrumentation-cohere/CHANGELOG.md new file mode 100644 index 0000000000..e404a518e6 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/CHANGELOG.md @@ -0,0 +1,15 @@ +# 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 scaffolding for Cohere instrumentation package + ([#4418](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4418)) +- Package structure, CI integration, examples, and stub instrumentor +- Minimum supported cohere version is 5.0.0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/LICENSE b/instrumentation-genai/opentelemetry-instrumentation-cohere/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/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. diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/README.rst b/instrumentation-genai/opentelemetry-instrumentation-cohere/README.rst new file mode 100644 index 0000000000..3b8a6aead3 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/README.rst @@ -0,0 +1,42 @@ +OpenTelemetry Cohere Instrumentation +===================================== + +|pypi| + +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-cohere.svg + :target: https://pypi.org/project/opentelemetry-instrumentation-cohere/ + +This library provides instrumentation for applications that use the `Cohere Python SDK `_. + +.. note:: + This package is currently a scaffold. Chat completions instrumentation + will be added in a follow-up PR. Installing and calling ``instrument()`` + is safe but will not produce spans or logs until then. + +Installation +------------ + +:: + + pip install opentelemetry-instrumentation-cohere + +Usage +----- + +.. code-block:: python + + from opentelemetry.instrumentation.cohere import CohereInstrumentor + + CohereInstrumentor().instrument() + + # Chat completions patching will be wired up in a follow-up PR. + # Once that lands, Cohere SDK calls will automatically produce + # traces and logs. + + +References +---------- + +* `OpenTelemetry Cohere Instrumentation `_ +* `OpenTelemetry Project `_ +* `OpenTelemetry Python Examples `_ diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/.env b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/.env new file mode 100644 index 0000000000..61e915052a --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/.env @@ -0,0 +1,2 @@ +OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 +OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/README.rst b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/README.rst new file mode 100644 index 0000000000..d5201dbea2 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/README.rst @@ -0,0 +1,50 @@ +OpenTelemetry Cohere Instrumentation Example +============================================= + +This is an example of how to instrument Cohere calls when configuring +OpenTelemetry SDK and Instrumentations manually. + +When chat completions support is added in a follow-up PR, `main.py `_ +will export traces and logs to an OTLP compatible endpoint. For now the +instrumentor is a no-op scaffold. + +Note: `.env <.env>`_ file configures additional environment variables: + +- `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true` is the setting + that will control whether Cohere instrumentation captures prompt and + completion contents on events, but it currently has no effect because + chat completions support has not yet been added. + +Setup +----- + +An OTLP compatible endpoint should be listening for traces and logs on +http://localhost:4317. If not, update "OTEL_EXPORTER_OTLP_ENDPOINT" as well. + +Next, set up a virtual environment like this: + +:: + + python3 -m venv .venv + source .venv/bin/activate + pip install "python-dotenv[cli]" + pip install -r requirements.txt + +You will also need a Cohere API key. Set it as an environment variable: + +:: + + export CO_API_KEY=your_api_key_here + +Run +--- + +Run the example like this: + +:: + + dotenv run -- python main.py + +At the moment, this example runs the placeholder scaffold in ``main.py``. +Once chat completions support is added, Cohere SDK calls will produce traces +and logs exported to your configured observability tool. diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/main.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/main.py new file mode 100644 index 0000000000..31dc79c408 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/main.py @@ -0,0 +1,39 @@ +# pylint: skip-file + +# NOTE: OpenTelemetry Python Logs and Events APIs are in beta +from opentelemetry import _logs, trace +from opentelemetry.exporter.otlp.proto.grpc._log_exporter import ( + OTLPLogExporter, +) +from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import ( + OTLPSpanExporter, +) +from opentelemetry.instrumentation.cohere import CohereInstrumentor +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +# configure tracing +trace.set_tracer_provider(TracerProvider()) +trace.get_tracer_provider().add_span_processor( + BatchSpanProcessor(OTLPSpanExporter()) +) + +# configure logging and events +_logs.set_logger_provider(LoggerProvider()) +_logs.get_logger_provider().add_log_record_processor( + BatchLogRecordProcessor(OTLPLogExporter()) +) + +# instrument Cohere +CohereInstrumentor().instrument() + + +def main(): + # TODO: Chat completions example will be added in a follow-up PR. + print("Cohere instrumentation is active.") + + +if __name__ == "__main__": + main() diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/requirements.txt new file mode 100644 index 0000000000..38079afd3f --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/manual/requirements.txt @@ -0,0 +1,4 @@ +cohere>=5.0.0 +opentelemetry-sdk~=1.39.0 +opentelemetry-instrumentation-cohere +opentelemetry-exporter-otlp-proto-grpc~=1.39.0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/.env b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/.env new file mode 100644 index 0000000000..61e915052a --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/.env @@ -0,0 +1,2 @@ +OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317 +OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/README.rst b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/README.rst new file mode 100644 index 0000000000..82d87a2332 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/README.rst @@ -0,0 +1,57 @@ +OpenTelemetry Cohere Zero-Code Instrumentation Example +====================================================== + +This is an example of how to use OpenTelemetry's automatic instrumentation +(zero-code) capabilities with the Cohere SDK. + +The `opentelemetry-instrument` CLI automatically instruments your Python +application without requiring code changes. Once chat completions support is +added in a follow-up PR, running `main.py `_ with the CLI will +export traces and logs to an OTLP compatible endpoint. + +Note: `.env <.env>`_ file configures additional environment variables: + +- `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true` is included for + consistency with other GenAI instrumentations, but it currently has no + effect for Cohere. Chat completions support has not yet been implemented. + +Setup +----- + +An OTLP compatible endpoint should be listening for traces and logs on +http://localhost:4317. If not, update "OTEL_EXPORTER_OTLP_ENDPOINT" as well. + +Next, set up a virtual environment like this: + +:: + + python3 -m venv .venv + source .venv/bin/activate + pip install "python-dotenv[cli]" + pip install -r requirements.txt + +You will also need a Cohere API key. Set it as an environment variable: + +:: + + export CO_API_KEY=your_api_key_here + +Run +--- + +Run the example with zero-code instrumentation like this: + +:: + + dotenv run -- opentelemetry-instrument python main.py + +This runs `main.py` under automatic instrumentation. Once chat completions +support is added in a follow-up PR, Cohere SDK calls will produce traces and +logs exported to your configured observability tool without code changes. + +Learn More +---------- + +See the `OpenTelemetry Python automatic instrumentation docs +`_ for more +information about zero-code instrumentation. diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/main.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/main.py new file mode 100644 index 0000000000..ef23a5636c --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/main.py @@ -0,0 +1,10 @@ +# pylint: skip-file + + +def main(): + # TODO: Chat completions example will be added in a follow-up PR. + print("Cohere instrumentation is active (zero-code).") + + +if __name__ == "__main__": + main() diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/requirements.txt b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/requirements.txt new file mode 100644 index 0000000000..0c34e2c868 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/examples/zero-code/requirements.txt @@ -0,0 +1,5 @@ +cohere>=5.0.0 +opentelemetry-sdk~=1.39.0 +opentelemetry-distro~=0.60b0 +opentelemetry-instrumentation-cohere +opentelemetry-exporter-otlp-proto-grpc~=1.39.0 diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/pyproject.toml b/instrumentation-genai/opentelemetry-instrumentation-cohere/pyproject.toml new file mode 100644 index 0000000000..aa11af6b97 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/pyproject.toml @@ -0,0 +1,57 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "opentelemetry-instrumentation-cohere" +dynamic = ["version"] +description = "OpenTelemetry Cohere instrumentation" +readme = "README.rst" +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", + "Programming Language :: Python :: 3.14", +] +dependencies = [ + "opentelemetry-api ~= 1.39", + "opentelemetry-instrumentation ~= 0.60b0", + "opentelemetry-semantic-conventions ~= 0.60b0", + "opentelemetry-util-genai >= 0.2b0, <0.6b0", +] + +[project.optional-dependencies] +instruments = ["cohere >= 5.0.0"] +test = [ + "opentelemetry-instrumentation-cohere[instruments]", + "opentelemetry-sdk", + "opentelemetry-test-utils", + "pytest", +] + +[project.entry-points.opentelemetry_instrumentor] +cohere = "opentelemetry.instrumentation.cohere:CohereInstrumentor" + +[project.urls] +Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation-genai/opentelemetry-instrumentation-cohere" +Repository = "https://github.com/open-telemetry/opentelemetry-python-contrib" + +[tool.hatch.version] +path = "src/opentelemetry/instrumentation/cohere/version.py" + +[tool.hatch.build.targets.sdist] +include = ["/src", "/tests", "/examples"] + +[tool.hatch.build.targets.wheel] +packages = ["src/opentelemetry"] diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/__init__.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/__init__.py new file mode 100644 index 0000000000..fefac8d591 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/__init__.py @@ -0,0 +1,61 @@ +# 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. + +""" +Cohere client instrumentation supporting `cohere`, it can be enabled by +using ``CohereInstrumentor``. + +.. note:: + This package is currently a scaffold. Chat completions instrumentation + will be added in a follow-up PR. Installing and calling instrument() is + safe but will not produce spans or logs until then. + +.. _cohere: https://pypi.org/project/cohere/ + +Usage +----- + +.. code:: python + + from opentelemetry.instrumentation.cohere import CohereInstrumentor + + CohereInstrumentor().instrument() + + # Chat completions patching will be wired up in a follow-up PR. + +API +--- +""" + +from typing import Collection + +from opentelemetry.instrumentation.cohere.package import _instruments +from opentelemetry.instrumentation.instrumentor import BaseInstrumentor + + +class CohereInstrumentor(BaseInstrumentor): + def instrumentation_dependencies(self) -> Collection[str]: + return _instruments + + def _instrument(self, **kwargs): + """Enable Cohere instrumentation. + + TODO: Chat completions patching will be added in a follow-up PR. + """ + + def _uninstrument(self, **kwargs): + """Disable Cohere instrumentation. + + TODO: Chat completions unpatching will be added in a follow-up PR. + """ diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/package.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/package.py new file mode 100644 index 0000000000..874616e539 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/package.py @@ -0,0 +1,16 @@ +# 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 = ("cohere >= 5.0.0",) diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/patch.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/patch.py new file mode 100644 index 0000000000..daed4028ff --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/patch.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. + +# TODO: Chat completions patching will be added in a follow-up PR. diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/version.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/version.py new file mode 100644 index 0000000000..e7bf4a48eb --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/src/opentelemetry/instrumentation/cohere/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.1b0.dev" diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/__init__.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/__init__.py new file mode 100644 index 0000000000..b0a6f42841 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/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. diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/conftest.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/conftest.py new file mode 100644 index 0000000000..1c209d580d --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/conftest.py @@ -0,0 +1,64 @@ +# 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 fixtures for Cohere instrumentation tests.""" + +import pytest + +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs.export import ( + InMemoryLogExporter, + SimpleLogRecordProcessor, +) +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import InMemoryMetricReader +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( + InMemorySpanExporter, +) + + +@pytest.fixture +def span_exporter(): + return InMemorySpanExporter() + + +@pytest.fixture +def tracer_provider(span_exporter): + provider = TracerProvider() + provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + return provider + + +@pytest.fixture +def log_exporter(): + return InMemoryLogExporter() + + +@pytest.fixture +def logger_provider(log_exporter): + provider = LoggerProvider() + provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter)) + return provider + + +@pytest.fixture +def metric_reader(): + return InMemoryMetricReader() + + +@pytest.fixture +def meter_provider(metric_reader): + return MeterProvider(metric_readers=[metric_reader]) diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.latest.txt b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.latest.txt new file mode 100644 index 0000000000..5246fe8ee6 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.latest.txt @@ -0,0 +1,47 @@ +# 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. + + +# ******************************** +# WARNING: NOT HERMETIC !!!!!!!!!! +# ******************************** +# +# This "requirements.txt" is installed in conjunction +# with multiple other dependencies in the top-level "tox.ini" +# file. In particular, please see: +# +# cohere-latest: {[testenv]test_deps} +# cohere-latest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.latest.txt +# +# This provides additional dependencies, namely: +# +# opentelemetry-api +# opentelemetry-sdk +# opentelemetry-semantic-conventions +# +# ... with a "dev" version based on the latest distribution. + + +# This variant of the requirements aims to test the system using +# the newest supported version of external dependencies. + +cohere +pytest==7.4.4 +pytest-asyncio==0.21.0 +wrapt==1.16.0 +# test with the latest version of opentelemetry-api, sdk, and semantic conventions + +-e opentelemetry-instrumentation +-e util/opentelemetry-util-genai +-e instrumentation-genai/opentelemetry-instrumentation-cohere diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.oldest.txt b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.oldest.txt new file mode 100644 index 0000000000..031dfd4493 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.oldest.txt @@ -0,0 +1,27 @@ +# 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. + +# This variant of the requirements aims to test the system using +# the oldest supported version of external dependencies. + +-e util/opentelemetry-util-genai +cohere==5.0.0 +pytest==7.4.4 +pytest-asyncio==0.21.0 +wrapt==1.16.0 +opentelemetry-api==1.39 # when updating, also update in pyproject.toml +opentelemetry-sdk==1.39 # when updating, also update in pyproject.toml +opentelemetry-semantic-conventions==0.60b0 # when updating, also update in pyproject.toml + +-e instrumentation-genai/opentelemetry-instrumentation-cohere diff --git a/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/test_instrumentor.py b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/test_instrumentor.py new file mode 100644 index 0000000000..5f8fa38993 --- /dev/null +++ b/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/test_instrumentor.py @@ -0,0 +1,68 @@ +# 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 the CohereInstrumentor class.""" + +from opentelemetry.instrumentation.cohere import CohereInstrumentor + + +def test_instrumentor_instantiation(): + instrumentor = CohereInstrumentor() + assert instrumentor is not None + assert isinstance(instrumentor, CohereInstrumentor) + + +def test_instrumentation_dependencies(): + instrumentor = CohereInstrumentor() + dependencies = instrumentor.instrumentation_dependencies() + + assert dependencies is not None + assert len(dependencies) > 0 + assert "cohere >= 5.0.0" in dependencies + + +def test_instrument_uninstrument_cycle( + tracer_provider, logger_provider, meter_provider +): + instrumentor = CohereInstrumentor() + + instrumentor.instrument( + tracer_provider=tracer_provider, + logger_provider=logger_provider, + meter_provider=meter_provider, + ) + instrumentor.uninstrument() + + instrumentor.instrument( + tracer_provider=tracer_provider, + logger_provider=logger_provider, + meter_provider=meter_provider, + ) + instrumentor.uninstrument() + + +def test_uninstrument_without_instrument(): + instrumentor = CohereInstrumentor() + instrumentor.uninstrument() + + +def test_instrumentor_has_required_attributes(): + instrumentor = CohereInstrumentor() + + assert hasattr(instrumentor, "instrument") + assert hasattr(instrumentor, "uninstrument") + assert hasattr(instrumentor, "instrumentation_dependencies") + assert callable(instrumentor.instrument) + assert callable(instrumentor.uninstrument) + assert callable(instrumentor.instrumentation_dependencies) diff --git a/pyproject.toml b/pyproject.toml index 17fb43b107..119c7dc955 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -207,6 +207,7 @@ include = [ "instrumentation/opentelemetry-instrumentation-threading", "instrumentation-genai/opentelemetry-instrumentation-anthropic", "instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk", + "instrumentation-genai/opentelemetry-instrumentation-cohere", "instrumentation-genai/opentelemetry-instrumentation-vertexai", "instrumentation-genai/opentelemetry-instrumentation-langchain", "instrumentation-genai/opentelemetry-instrumentation-weaviate", @@ -225,6 +226,8 @@ exclude = [ "instrumentation-genai/opentelemetry-instrumentation-anthropic/examples/**/*.py", "instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk/tests/**/*.py", "instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk/examples/**/*.py", + "instrumentation-genai/opentelemetry-instrumentation-cohere/tests/**/*.py", + "instrumentation-genai/opentelemetry-instrumentation-cohere/examples/**/*.py", "instrumentation-genai/opentelemetry-instrumentation-vertexai/tests/**/*.py", "instrumentation-genai/opentelemetry-instrumentation-vertexai/examples/**/*.py", "instrumentation-genai/opentelemetry-instrumentation-langchain/tests/**/*.py", diff --git a/scripts/generate_instrumentation_bootstrap.py b/scripts/generate_instrumentation_bootstrap.py index dd40e0223f..53ba567bb7 100755 --- a/scripts/generate_instrumentation_bootstrap.py +++ b/scripts/generate_instrumentation_bootstrap.py @@ -84,6 +84,10 @@ # development. This filter will get removed once it is further along in its # development lifecycle and ready to be included by default. "opentelemetry-instrumentation-claude-agent-sdk", + # Cohere instrumentation is currently excluded because it is still in early + # development. This filter will get removed once it is further along in its + # development lifecycle and ready to be included by default. + "opentelemetry-instrumentation-cohere", ] # Static version specifiers for instrumentations that are released independently diff --git a/tox.ini b/tox.ini index 1f2ca7f8e9..1a695f9515 100644 --- a/tox.ini +++ b/tox.ini @@ -36,6 +36,10 @@ envlist = # pypy3-test-instrumentation-anthropic-{oldest,latest} lint-instrumentation-anthropic + ; instrumentation-cohere + py3{10,11,12,13,14}-test-instrumentation-cohere-{oldest,latest} + lint-instrumentation-cohere + ; instrumentation-claude-agent-sdk py3{10,11,12,13}-test-instrumentation-claude-agent-sdk-{oldest,latest} # Disabling pypy3 as jiter (anthropic dep) requires PyPy 3.11+ @@ -502,6 +506,11 @@ deps = anthropic-latest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-anthropic/tests/requirements.latest.txt lint-instrumentation-anthropic: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-anthropic/tests/requirements.oldest.txt + cohere-oldest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.oldest.txt + cohere-latest: {[testenv]test_deps} + cohere-latest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.latest.txt + lint-instrumentation-cohere: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere/tests/requirements.oldest.txt + claude-agent-sdk-oldest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk/tests/requirements.oldest.txt claude-agent-sdk-latest: {[testenv]test_deps} claude-agent-sdk-latest: -r {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk/tests/requirements.latest.txt @@ -917,6 +926,9 @@ commands = test-instrumentation-anthropic: pytest {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-anthropic/tests --vcr-record=none {posargs} lint-instrumentation-anthropic: sh -c "cd instrumentation-genai && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-anthropic" + test-instrumentation-cohere: pytest {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere/tests {posargs} + lint-instrumentation-cohere: sh -c "cd instrumentation-genai && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-cohere" + test-instrumentation-claude-agent-sdk: pytest {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk/tests --vcr-record=none {posargs} lint-instrumentation-claude-agent-sdk: sh -c "cd instrumentation-genai && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-claude-agent-sdk" @@ -1144,6 +1156,7 @@ deps = {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai[instruments] {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-google-genai[instruments] {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-anthropic[instruments] + {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-cohere[instruments] {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-langchain[instruments] {toxinidir}/instrumentation-genai/opentelemetry-instrumentation-claude-agent-sdk[instruments] {toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka[instruments]