From 05ec5cce8d6af78eafce26b0f22d472ed0d98123 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Thu, 20 Aug 2026 12:45:21 -0700 Subject: [PATCH] chore(ci): remove CodSpeed benchmarks Drops the CodSpeed workflow along with everything that existed only to feed it: the tests/benchmarks suite, the pytest-codspeed CI dependency, its uv.lock and license-cache entries, and the README badge. --- .github/workflows/codspeed.yml | 72 ------ README.md | 3 - license_cache.json | 1 - pyproject.toml | 1 - tests/benchmarks/__init__.py | 0 tests/benchmarks/conftest.py | 36 --- tests/benchmarks/test_a2a_benchmarks.py | 76 ------ tests/benchmarks/test_benchmarks.py | 228 ------------------ tests/benchmarks/test_inference_benchmarks.py | 113 --------- tests/benchmarks/test_mcp_benchmarks.py | 84 ------- uv.lock | 30 +-- 11 files changed, 1 insertion(+), 643 deletions(-) delete mode 100644 .github/workflows/codspeed.yml delete mode 100644 tests/benchmarks/__init__.py delete mode 100644 tests/benchmarks/conftest.py delete mode 100644 tests/benchmarks/test_a2a_benchmarks.py delete mode 100644 tests/benchmarks/test_benchmarks.py delete mode 100644 tests/benchmarks/test_inference_benchmarks.py delete mode 100644 tests/benchmarks/test_mcp_benchmarks.py diff --git a/.github/workflows/codspeed.yml b/.github/workflows/codspeed.yml deleted file mode 100644 index a69e50b5753..00000000000 --- a/.github/workflows/codspeed.yml +++ /dev/null @@ -1,72 +0,0 @@ -name: CodSpeed Benchmarks - -on: - push: - branches: - - main - - litellm_internal_staging - paths: - - "litellm/**" - - "tests/benchmarks/**" - - "pyproject.toml" - - "uv.lock" - - ".github/workflows/codspeed.yml" - - ".github/actions/setup-uv-with-retries/**" - pull_request: - branches: - - main - - litellm_internal_staging - paths: - - "litellm/**" - - "tests/benchmarks/**" - - "pyproject.toml" - - "uv.lock" - - ".github/workflows/codspeed.yml" - - ".github/actions/setup-uv-with-retries/**" - # Allow CodSpeed to trigger backtest performance analysis - # in order to generate initial data - workflow_dispatch: - -permissions: - contents: read - id-token: write - -concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} - cancel-in-progress: true - -jobs: - benchmarks: - runs-on: ubuntu-24.04 - timeout-minutes: 60 - - steps: - - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - with: - persist-credentials: false - - - name: Set up Python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 - with: - python-version: "3.12" - - - name: Set up uv - uses: ./.github/actions/setup-uv-with-retries - with: - version: "0.10.9" - - - name: Run benchmarks - uses: CodSpeedHQ/action@1c8ae4843586d3ba879736b7f6b7b0c990757fab # v4.12.1 - with: - mode: simulation - run: > - env PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 - uv run --frozen --no-default-groups - --with pytest==8.3.5 - --with pytest-codspeed==4.3.0 - --with "mcp>=1.26.0,<2.0" - --with "a2a-sdk>=1.1.0,<2.0" - pytest - -p pytest_codspeed.plugin - tests/benchmarks/ - --codspeed diff --git a/README.md b/README.md index 32b0160dbaa..73a3565e147 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,6 @@ Slack - - CodSpeed - LiteLLM AI Gateway diff --git a/license_cache.json b/license_cache.json index dc061b48f4f..723019fb158 100644 --- a/license_cache.json +++ b/license_cache.json @@ -30,7 +30,6 @@ "openapi-core:0.22.0": "BSD-3-Clause", "pytest-timeout:2.4.0": "MIT", "hypercorn:0.17.3": "MIT", - "pytest-codspeed:4.3.0": "The MIT License (MIT) Copyright (c) 2022 CodSpeed and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ", "pytest-retry:1.7.0": "MIT License Copyright (c) 2022 Silas Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ", "pyarrow:21.0.0": "Apache Software License", "pyarrow:22.0.0": "Apache Software License", diff --git a/pyproject.toml b/pyproject.toml index ffbc96eefb9..567e7542867 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -227,7 +227,6 @@ ci = [ "Pillow==12.3.0", # Azure batch E2E tests still import psycopg2 directly. "psycopg2-binary==2.9.11", - "pytest-codspeed==4.3.0", "pytest-retry==1.7.0", "pyarrow==23.0.1", "langchain==1.3.9", diff --git a/tests/benchmarks/__init__.py b/tests/benchmarks/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/benchmarks/conftest.py b/tests/benchmarks/conftest.py deleted file mode 100644 index c9b31cfb7d7..00000000000 --- a/tests/benchmarks/conftest.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Shared setup keeping CodSpeed measurements hermetic. - -CodSpeed's callgrind instrumentation counts instructions from every thread while -a measurement window is open, and valgrind serializes all threads onto one -virtual CPU. Work deferred to litellm's shared logging executor would therefore -be attributed to whichever benchmark the valgrind scheduler resumes it under, -flipping results between runs. Running the executor inline keeps each -benchmark's cost self-contained and deterministic. -""" - -from collections.abc import Callable, Iterator -from concurrent.futures import Future -from typing import ParamSpec, TypeVar - -import pytest - -from litellm.litellm_core_utils.thread_pool_executor import executor - -P = ParamSpec("P") -R = TypeVar("R") - - -def _submit_inline(fn: Callable[P, R], /, *args: P.args, **kwargs: P.kwargs) -> Future[R]: - future: Future[R] = Future() - try: - future.set_result(fn(*args, **kwargs)) - except BaseException as exc: - future.set_exception(exc) - return future - - -@pytest.fixture(autouse=True, scope="session") -def inline_logging_executor() -> Iterator[None]: - executor.submit = _submit_inline - yield - del executor.submit diff --git a/tests/benchmarks/test_a2a_benchmarks.py b/tests/benchmarks/test_a2a_benchmarks.py deleted file mode 100644 index cf7726230b6..00000000000 --- a/tests/benchmarks/test_a2a_benchmarks.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -Performance benchmarks for the A2A (agent-to-agent) message-translation hot path. - -Both directions are covered: the client direction (litellm.completion talking to -an upstream A2A agent) converts OpenAI messages into a prompt and extracts text -from the A2A response, and the proxy server-ingress direction converts an inbound -A2A message into OpenAI messages before bridging to a completion. All are pure-CPU -per-request transforms. -""" - -import pytest - -from litellm.a2a_protocol.litellm_completion_bridge.transformation import ( - A2ACompletionBridgeTransformation, -) -from litellm.llms.a2a.common_utils import ( - convert_messages_to_prompt, - extract_text_from_a2a_response, -) - -MESSAGES = [ - {"role": "system", "content": "You are a helpful research assistant."}, - {"role": "user", "content": "What is the capital of France?"}, - {"role": "assistant", "content": "The capital of France is Paris."}, - {"role": "user", "content": "And what is its population?"}, -] - -MESSAGE_RESPONSE = { - "result": { - "kind": "message", - "parts": [ - {"kind": "text", "text": "The population of Paris is about 2.1 million."}, - {"kind": "text", "text": "The metro area has over 12 million people."}, - ], - } -} - -TASK_RESPONSE = { - "result": { - "kind": "task", - "artifacts": [{"parts": [{"kind": "text", "text": "Paris has a population of about 2.1 million."}]}], - } -} - -A2A_INBOUND_MESSAGE = { - "role": "user", - "parts": [ - {"kind": "text", "text": "Summarize the latest quarterly report."}, - {"kind": "text", "text": "Focus on revenue and margins."}, - ], - "messageId": "msg-1", -} - - -@pytest.mark.benchmark -def test_convert_messages_to_a2a_prompt(): - """Benchmark converting OpenAI messages into an A2A prompt string.""" - convert_messages_to_prompt(messages=MESSAGES) - - -@pytest.mark.benchmark -def test_extract_text_from_a2a_message_response(): - """Benchmark extracting text from a direct-message A2A response.""" - extract_text_from_a2a_response(response_dict=MESSAGE_RESPONSE) - - -@pytest.mark.benchmark -def test_extract_text_from_a2a_task_response(): - """Benchmark extracting text from a task-with-artifacts A2A response.""" - extract_text_from_a2a_response(response_dict=TASK_RESPONSE) - - -@pytest.mark.benchmark -def test_a2a_inbound_message_to_openai_messages(): - """Benchmark the proxy converting an inbound A2A message into OpenAI messages.""" - A2ACompletionBridgeTransformation.a2a_message_to_openai_messages(A2A_INBOUND_MESSAGE) diff --git a/tests/benchmarks/test_benchmarks.py b/tests/benchmarks/test_benchmarks.py deleted file mode 100644 index 59b3e0b6d5c..00000000000 --- a/tests/benchmarks/test_benchmarks.py +++ /dev/null @@ -1,228 +0,0 @@ -""" -Performance benchmarks for litellm core operations. - -These benchmarks measure the performance of frequently called functions -in the litellm hot path: token counting, model info lookup, provider -resolution, and cost calculation. -""" - -import threading - -import pytest - -import litellm -from litellm.litellm_core_utils.get_llm_provider_logic import get_llm_provider -from litellm.litellm_core_utils.thread_pool_executor import executor -from litellm.litellm_core_utils.token_counter import token_counter - - -# --------------------------------------------------------------------------- -# Fixtures -# --------------------------------------------------------------------------- - -SIMPLE_MESSAGES = [{"role": "user", "content": "Hello, how are you?"}] - -MULTI_TURN_MESSAGES = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "What is the capital of France?"}, - { - "role": "assistant", - "content": "The capital of France is Paris. It is known as the City of Light.", - }, - {"role": "user", "content": "Tell me more about Paris."}, - { - "role": "assistant", - "content": ( - "Paris is the capital and most populous city of France. " - "With an estimated population of 2,165,423 in 2019, it is the " - "centre of the Ile-de-France region. The city is a major European " - "cultural and commercial centre." - ), - }, - {"role": "user", "content": "What are the top tourist attractions?"}, -] - -LONG_CONTENT_MESSAGE = [ - { - "role": "user", - "content": "Explain the following concept in detail: " + "word " * 500, - } -] - -TOOL_DEFINITIONS = [ - { - "type": "function", - "function": { - "name": "get_weather", - "description": "Get the current weather in a given location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA", - }, - "unit": { - "type": "string", - "enum": ["celsius", "fahrenheit"], - }, - }, - "required": ["location"], - }, - }, - } -] - - -# --------------------------------------------------------------------------- -# Token counting benchmarks -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_token_counter_simple_message(): - """Benchmark token counting for a single short message.""" - token_counter(model="gpt-4o", messages=SIMPLE_MESSAGES) - - -@pytest.mark.benchmark -def test_token_counter_multi_turn(): - """Benchmark token counting for a multi-turn conversation.""" - token_counter(model="gpt-4o", messages=MULTI_TURN_MESSAGES) - - -@pytest.mark.benchmark -def test_token_counter_long_content(): - """Benchmark token counting for a message with long content.""" - token_counter(model="gpt-4o", messages=LONG_CONTENT_MESSAGE) - - -@pytest.mark.benchmark -def test_token_counter_with_tools(): - """Benchmark token counting with tool definitions.""" - token_counter( - model="gpt-4o", - messages=SIMPLE_MESSAGES, - tools=TOOL_DEFINITIONS, - ) - - -@pytest.mark.benchmark -def test_token_counter_raw_text(): - """Benchmark token counting for raw text input.""" - token_counter(model="gpt-4o", text="The quick brown fox jumps over the lazy dog.") - - -# --------------------------------------------------------------------------- -# Model info lookup benchmarks -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_get_model_info_openai(): - """Benchmark model info lookup for an OpenAI model.""" - litellm.get_model_info("gpt-4o") - - -@pytest.mark.benchmark -def test_get_model_info_anthropic(): - """Benchmark model info lookup for an Anthropic model.""" - litellm.get_model_info("claude-sonnet-4-20250514") - - -@pytest.mark.benchmark -def test_get_model_info_with_provider(): - """Benchmark model info lookup with an explicit provider prefix.""" - litellm.get_model_info("openai/gpt-4o", custom_llm_provider="openai") - - -# --------------------------------------------------------------------------- -# Provider resolution benchmarks -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_get_llm_provider_openai(): - """Benchmark LLM provider resolution for OpenAI.""" - get_llm_provider(model="gpt-4o") - - -@pytest.mark.benchmark -def test_get_llm_provider_anthropic(): - """Benchmark LLM provider resolution for Anthropic.""" - get_llm_provider(model="claude-sonnet-4-20250514") - - -@pytest.mark.benchmark -def test_get_llm_provider_with_prefix(): - """Benchmark LLM provider resolution with provider prefix.""" - get_llm_provider(model="openai/gpt-4o") - - -@pytest.mark.benchmark -def test_get_llm_provider_azure(): - """Benchmark LLM provider resolution for Azure.""" - get_llm_provider( - model="azure/gpt-4o", - api_base="https://my-endpoint.openai.azure.com", - ) - - -# --------------------------------------------------------------------------- -# Cost calculation benchmarks -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_cost_per_token_openai(): - """Benchmark cost-per-token calculation for OpenAI models.""" - litellm.cost_per_token( - model="gpt-4o", - prompt_tokens=1000, - completion_tokens=500, - ) - - -@pytest.mark.benchmark -def test_cost_per_token_anthropic(): - """Benchmark cost-per-token calculation for Anthropic models.""" - litellm.cost_per_token( - model="claude-sonnet-4-20250514", - prompt_tokens=1000, - completion_tokens=500, - ) - - -# --------------------------------------------------------------------------- -# Model cost key resolution benchmarks -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_get_model_cost_key_exact_match(): - """Benchmark model cost key lookup with an exact match.""" - litellm.utils._get_model_cost_key("gpt-4o") - - -@pytest.mark.benchmark -def test_get_model_cost_key_case_insensitive(): - """Benchmark model cost key lookup with case-insensitive fallback.""" - litellm.utils._get_model_cost_key("GPT-4o") - - -# --------------------------------------------------------------------------- -# Measurement hermeticity guard -# --------------------------------------------------------------------------- - - -@pytest.mark.benchmark -def test_logging_executor_runs_inline(): - """Guard that the shared logging executor runs submissions inline. - - Deferred submissions execute on worker threads, and callgrind attributes - their instructions to whichever benchmark's measurement window is open when - the valgrind scheduler resumes them, making results nondeterministic. - """ - future = executor.submit(threading.get_ident) - assert future.done() - assert future.result() == threading.get_ident() diff --git a/tests/benchmarks/test_inference_benchmarks.py b/tests/benchmarks/test_inference_benchmarks.py deleted file mode 100644 index 0a95e34a32c..00000000000 --- a/tests/benchmarks/test_inference_benchmarks.py +++ /dev/null @@ -1,113 +0,0 @@ -""" -Performance benchmarks for the LLM inference (chat completion) hot path. - -The end-to-end cases use ``mock_response`` so the full SDK overhead is exercised --- provider resolution, request/response transformation, ``ModelResponse`` -construction, token counting and cost calculation -- without any network I/O. The -``convert_to_model_response_object`` case isolates the provider-response to -``ModelResponse`` translation, the single deterministic core every non-streaming -completion runs. -""" - -import pytest - -import litellm -from litellm.litellm_core_utils.llm_response_utils.convert_dict_to_response import ( - convert_to_model_response_object, -) -from litellm.types.utils import ModelResponse - -SIMPLE_MESSAGES = [{"role": "user", "content": "Hello, how are you?"}] - -MULTI_TURN_MESSAGES = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": "What is the capital of France?"}, - { - "role": "assistant", - "content": "The capital of France is Paris. It is known as the City of Light.", - }, - {"role": "user", "content": "Tell me more about Paris."}, -] - -TOOL_DEFINITIONS = [ - { - "type": "function", - "function": { - "name": "get_weather", - "description": "Get the current weather in a given location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - "description": "The city and state, e.g. San Francisco, CA", - }, - "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}, - }, - "required": ["location"], - }, - }, - } -] - -MOCK_RESPONSE = "The capital of France is Paris, the country's largest city and cultural centre." - -PROVIDER_RESPONSE = { - "id": "chatcmpl-abc123", - "object": "chat.completion", - "created": 1700000000, - "model": "gpt-4o", - "choices": [ - { - "index": 0, - "finish_reason": "stop", - "message": {"role": "assistant", "content": MOCK_RESPONSE}, - } - ], - "usage": {"prompt_tokens": 12, "completion_tokens": 16, "total_tokens": 28}, -} - - -@pytest.mark.benchmark -def test_completion_simple_message(): - """Benchmark a single-message completion through the full SDK path.""" - litellm.completion(model="gpt-4o", messages=SIMPLE_MESSAGES, mock_response=MOCK_RESPONSE) - - -@pytest.mark.benchmark -def test_completion_multi_turn(): - """Benchmark a multi-turn completion through the full SDK path.""" - litellm.completion(model="gpt-4o", messages=MULTI_TURN_MESSAGES, mock_response=MOCK_RESPONSE) - - -@pytest.mark.benchmark -def test_completion_with_tools(): - """Benchmark a completion that has to process tool schemas.""" - litellm.completion( - model="gpt-4o", - messages=SIMPLE_MESSAGES, - tools=TOOL_DEFINITIONS, - mock_response=MOCK_RESPONSE, - ) - - -@pytest.mark.benchmark -def test_completion_streaming(): - """Benchmark consuming a full streamed completion (CustomStreamWrapper).""" - stream = litellm.completion( - model="gpt-4o", - messages=SIMPLE_MESSAGES, - mock_response=MOCK_RESPONSE, - stream=True, - ) - for _ in stream: - pass - - -@pytest.mark.benchmark -def test_response_to_model_response_object(): - """Benchmark the provider-response to ModelResponse translation core.""" - convert_to_model_response_object( - response_object=PROVIDER_RESPONSE, - model_response_object=ModelResponse(), - ) diff --git a/tests/benchmarks/test_mcp_benchmarks.py b/tests/benchmarks/test_mcp_benchmarks.py deleted file mode 100644 index 7e23ab1b4f5..00000000000 --- a/tests/benchmarks/test_mcp_benchmarks.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Performance benchmarks for the MCP tool hot path. - -Two layers are covered: the client-side translation between MCP and OpenAI -function-calling formats, and the server-side tool-name prefixing that the proxy -runs on every list-tools (prefix each tool) and call-tool (strip prefix to route) -request. Both are pure-CPU and deterministic. -""" - -import pytest -from mcp.types import Tool as MCPTool - -from litellm.experimental_mcp_client.tools import ( - transform_mcp_tool_to_openai_tool, - transform_openai_tool_call_request_to_mcp_tool_call_request, -) -from litellm.proxy._experimental.mcp_server.utils import ( - add_server_prefix_to_name, - split_server_prefix_from_name, -) - - -def _make_tool(index: int) -> MCPTool: - return MCPTool( - name=f"tool_{index}", - description=f"Test tool number {index} that performs an operation", - inputSchema={ - "type": "object", - "properties": { - "query": {"type": "string", "description": "The search query"}, - "limit": {"type": "integer", "description": "Max results"}, - }, - "required": ["query"], - }, - ) - - -SINGLE_TOOL = _make_tool(0) -TOOL_LIST = tuple(_make_tool(i) for i in range(20)) -TOOL_NAMES = tuple(t.name for t in TOOL_LIST) - -SERVER_NAME = "github_mcp" -PREFIXED_TOOL_NAME = add_server_prefix_to_name("tool_0", SERVER_NAME) - -OPENAI_TOOL_CALL = { - "id": "call_abc123", - "type": "function", - "function": { - "name": "tool_0", - "arguments": '{"query": "weather in San Francisco", "limit": 5}', - }, -} - - -@pytest.mark.benchmark -def test_transform_single_mcp_tool_to_openai(): - """Benchmark translating one MCP tool into OpenAI tool format.""" - transform_mcp_tool_to_openai_tool(mcp_tool=SINGLE_TOOL) - - -@pytest.mark.benchmark -def test_transform_mcp_tool_list_to_openai(): - """Benchmark translating a full list-tools response into OpenAI format.""" - for tool in TOOL_LIST: - transform_mcp_tool_to_openai_tool(mcp_tool=tool) - - -@pytest.mark.benchmark -def test_transform_openai_tool_call_to_mcp(): - """Benchmark translating an OpenAI tool call into an MCP call request.""" - transform_openai_tool_call_request_to_mcp_tool_call_request(openai_tool=OPENAI_TOOL_CALL) - - -@pytest.mark.benchmark -def test_mcp_server_prefix_tool_list(): - """Benchmark the proxy prefixing every tool name on a list-tools response.""" - for name in TOOL_NAMES: - add_server_prefix_to_name(name, SERVER_NAME) - - -@pytest.mark.benchmark -def test_mcp_server_strip_prefix_on_call(): - """Benchmark the proxy stripping the server prefix to route a tool call.""" - split_server_prefix_from_name(PREFIXED_TOOL_NAME) diff --git a/uv.lock b/uv.lock index d9e2fb94667..09e8c57034f 100644 --- a/uv.lock +++ b/uv.lock @@ -10,7 +10,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-08-16T00:41:08.185444Z" +exclude-newer = "2026-08-17T19:44:39.637899Z" exclude-newer-span = "P3D" [manifest] @@ -4341,7 +4341,6 @@ ci = [ { name = "pyarrow" }, { name = "pygithub" }, { name = "pylint" }, - { name = "pytest-codspeed" }, { name = "pytest-retry" }, { name = "tenacity" }, { name = "traceloop-sdk" }, @@ -4521,7 +4520,6 @@ ci = [ { name = "pyarrow", specifier = "==23.0.1" }, { name = "pygithub", specifier = "==2.8.1" }, { name = "pylint", specifier = "==4.0.5" }, - { name = "pytest-codspeed", specifier = "==4.3.0" }, { name = "pytest-retry", specifier = "==1.7.0" }, { name = "tenacity", specifier = "==8.5.0" }, { name = "traceloop-sdk", specifier = "==0.33.12" }, @@ -7545,32 +7543,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, ] -[[package]] -name = "pytest-codspeed" -version = "4.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, - { name = "pytest" }, - { name = "rich" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/ab/eca41967d11c95392829a8b4bfa9220a51cffc4a33ec4653358000356918/pytest_codspeed-4.3.0.tar.gz", hash = "sha256:5230d9d65f39063a313ed1820df775166227ec5c20a1122968f85653d5efee48", size = 124745, upload-time = "2026-02-09T15:23:34.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/64/800bdaeabd3eb126aff7e3e22dc45b2826305f61cbfd093284caf8d9ca01/pytest_codspeed-4.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2acecc4126658abebc683b38121adec405a46e18a619d49d6154c6e60c5deb2", size = 347077, upload-time = "2026-02-09T15:23:17.2Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f1/d69707440829adab86d078d5f1c8c070df116b1624f8eae4ff36933ba612/pytest_codspeed-4.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:619120775e92a3f43fb4ff4c256a251b1554c904d95e2154a382484283f0388a", size = 342234, upload-time = "2026-02-09T15:23:18.407Z" }, - { url = "https://files.pythonhosted.org/packages/d9/15/ec0ac1f022173b3134c9638f2a35f21fbb3142c75da066d9e49e5a8bb4bd/pytest_codspeed-4.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dbeff1eb2f2e36df088658b556fa993e6937bf64ffb07406de4db16fd2b26874", size = 347076, upload-time = "2026-02-09T15:23:19.989Z" }, - { url = "https://files.pythonhosted.org/packages/a5/e8/1fe375794ad02b7835f378a7bcfa8fbac9acadefe600a782a7c4a7064db7/pytest_codspeed-4.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:878aad5e4bb7b401ad8d82f3af5186030cd2bd0d0446782e10dabb9db8827466", size = 342215, upload-time = "2026-02-09T15:23:20.954Z" }, - { url = "https://files.pythonhosted.org/packages/09/58/50df94e9a78e1c77818a492c90557eeb1309af025120c9a21e6375950c52/pytest_codspeed-4.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527a3a02eaa3e4d4583adc4ba2327eef79628f3e1c682a4b959439551a72588e", size = 347395, upload-time = "2026-02-09T15:23:21.986Z" }, - { url = "https://files.pythonhosted.org/packages/e4/56/7dfbd3eefd112a14e6fb65f9ff31dacf2e9c381cb94b27332b81d2b13f8d/pytest_codspeed-4.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9858c2a6e1f391d5696757e7b6e9484749a7376c46f8b4dd9aebf093479a9667", size = 342625, upload-time = "2026-02-09T15:23:23.035Z" }, - { url = "https://files.pythonhosted.org/packages/7f/53/7255f6a25bc56ff1745b254b21545dfe0be2268f5b91ce78f7e8a908f0ad/pytest_codspeed-4.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34f2fd8497456eefbd325673f677ea80d93bb1bc08a578c1fa43a09cec3d1879", size = 347325, upload-time = "2026-02-09T15:23:23.998Z" }, - { url = "https://files.pythonhosted.org/packages/2e/f8/82ae570d8b9ad30f33c9d4002a7a1b2740de0e090540c69a28e4f711ebe2/pytest_codspeed-4.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df6a36a2a9da1406bc50428437f657f0bd8c842ae54bee5fb3ad30e01d50c0f5", size = 342558, upload-time = "2026-02-09T15:23:25.656Z" }, - { url = "https://files.pythonhosted.org/packages/b3/e1/55cfe9474f91d174c7a4b04d257b5fc6d4d06f3d3680f2da672ee59ccc10/pytest_codspeed-4.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bec30f4fc9c4973143cd80f0d33fa780e9fa3e01e4dbe8cedf229e72f1212c62", size = 347383, upload-time = "2026-02-09T15:23:26.68Z" }, - { url = "https://files.pythonhosted.org/packages/7f/3b/8fd781d959bbe789b3de8ce4c50d5706a684a0df377147dfb27b200c20c1/pytest_codspeed-4.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e6584e641cadf27d894ae90b87c50377232a97cbfd76ee0c7ecd0c056fa3f7f4", size = 342481, upload-time = "2026-02-09T15:23:27.686Z" }, - { url = "https://files.pythonhosted.org/packages/bb/0c/368045133c6effa2c665b1634b7b8a9c88b307f877fa31f1f8df47885b51/pytest_codspeed-4.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df0d1f6ea594f29b745c634d66d5f5f1caa1c3abd2af82fea49d656038e8fc77", size = 353680, upload-time = "2026-02-09T15:23:28.726Z" }, - { url = "https://files.pythonhosted.org/packages/59/21/e543abcd72244294e25ae88ec3a9311ade24d6913f8c8f42569d671700bc/pytest_codspeed-4.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2f5bb6d8898bea7db45e3c8b916ee48e36905b929477bb511b79c5a3ccacda4", size = 347888, upload-time = "2026-02-09T15:23:30.443Z" }, - { url = "https://files.pythonhosted.org/packages/55/d9/b8a53c20cf5b41042c205bb9d36d37da00418d30fd1a94bf9eb147820720/pytest_codspeed-4.3.0-py3-none-any.whl", hash = "sha256:05baff2a61dc9f3e92b92b9c2ab5fb45d9b802438f5373073f5766a91319ed7a", size = 125224, upload-time = "2026-02-09T15:23:33.774Z" }, -] - [[package]] name = "pytest-cov" version = "5.0.0"