Skip to content

Conversation

@codeflash-ai
Copy link

@codeflash-ai codeflash-ai bot commented Oct 11, 2025

📄 17% (0.17x) speedup for custom_job_tensorboard_console_uri in google/cloud/aiplatform/utils/console_utils.py

⏱️ Runtime : 425 microseconds 363 microseconds (best of 346 runs)

📝 Explanation and details

The optimization achieves a 16% speedup by adding method lookup caching to the _parse_resource_name function in the VertexAiResourceNoun class.

Key Optimization:

  • Added @lru_cache(maxsize=32) to a new helper function _get_parse_resource_name_method_for_cls() that caches the expensive method lookup: getattr(cls.client_class.get_gapic_client_class(), cls._parse_resource_name_method)
  • The original code performed this complex attribute resolution chain on every call, taking ~7581ns per hit
  • The cached version reduces this to just ~475ns per hit for cache hits

Why This Works:
The method lookup involves traversing multiple object attributes (cls.client_class.get_gapic_client_class()) which is computationally expensive. Since the same class typically calls _parse_resource_name repeatedly with the same method resolution, caching eliminates this redundant work.

Performance Impact:

  • Line profiler shows the method lookup time dropped from 100% of function time to just 6.7%
  • The actual parsing work (method(resource_name)) remains unchanged at ~93.3% of function time
  • Test results show consistent 13-45% improvements across various test cases, with larger gains on edge cases that hit the cache more frequently

Minor Secondary Optimization:
In console_utils.py, extracted custom_job_resource_name.split('/')[-1] to a variable to avoid duplicate string splitting, providing small additional gains (2-4μs improvements in tests).

This optimization is particularly effective for applications that parse many resource names with the same class types, as subsequent calls benefit from the cached method lookup.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 🔘 None Found
🌀 Generated Regression Tests 155 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
🌀 Generated Regression Tests and Runtime
import pytest  # used for our unit tests
from aiplatform.utils.console_utils import custom_job_tensorboard_console_uri

# --- Begin function to test and minimal stubs ---

# Minimal stub for tensorboard.Tensorboard._parse_resource_name
class TensorboardStub:
    @staticmethod
    def _parse_resource_name(resource_name: str):
        # Example resource_name: 'projects/123/locations/us-central1/tensorboards/456'
        # Parse into dict: {'project': '123', 'location': 'us-central1', 'tensorboard': '456'}
        parts = resource_name.split('/')
        if len(parts) < 6:
            raise ValueError("Malformed tensorboard resource name")
        return {
            'project': parts[1],
            'location': parts[3],
            'tensorboard': parts[5]
        }

# Patch the tensorboard.Tensorboard to our stub for tests
class tensorboard:
    Tensorboard = TensorboardStub
from aiplatform.utils.console_utils import custom_job_tensorboard_console_uri

# --- End function to test and minimal stubs ---

# --- Begin unit tests ---

# 1. Basic Test Cases

def test_basic_valid_resource_names():
    # Test with typical resource names
    tensorboard_resource_name = "projects/123/locations/us-central1/tensorboards/456"
    custom_job_resource_name = "projects/123/locations/us-central1/customJobs/789"
    # The experiment id should be '789'
    expected_uri = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        "projects+123+locations+us-central1+tensorboards+456+experiments+789"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 6.13μs -> 4.94μs (24.1% faster)

def test_basic_different_location_and_ids():
    # Test with different location and ids
    tensorboard_resource_name = "projects/abc/locations/europe-west4/tensorboards/def"
    custom_job_resource_name = "projects/abc/locations/europe-west4/customJobs/ghi"
    expected_uri = (
        "https://europe-west4.tensorboard.googleusercontent.com/experiment/"
        "projects+abc+locations+europe-west4+tensorboards+def+experiments+ghi"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 5.58μs -> 4.44μs (25.6% faster)

def test_basic_custom_job_id_with_numbers_and_letters():
    tensorboard_resource_name = "projects/999/locations/asia-southeast1/tensorboards/xyz"
    custom_job_resource_name = "projects/999/locations/asia-southeast1/customJobs/job123"
    expected_uri = (
        "https://asia-southeast1.tensorboard.googleusercontent.com/experiment/"
        "projects+999+locations+asia-southeast1+tensorboards+xyz+experiments+job123"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 5.62μs -> 4.45μs (26.3% faster)

# 2. Edge Test Cases


def test_edge_custom_job_resource_name_missing_id():
    # Should use the last segment as experiment id, which is 'customJobs'
    tensorboard_resource_name = "projects/123/locations/us-central1/tensorboards/456"
    custom_job_resource_name = "projects/123/locations/us-central1/customJobs"
    expected_uri = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        "projects+123+locations+us-central1+tensorboards+456+experiments+customJobs"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 9.50μs -> 7.03μs (35.1% faster)

def test_edge_custom_job_resource_name_extra_slashes():
    # Should handle extra slashes gracefully
    tensorboard_resource_name = "projects/123/locations/us-central1/tensorboards/456"
    custom_job_resource_name = "projects/123/locations/us-central1/customJobs/789/"
    # The last segment is empty, so split('/')[-1] should be ''
    expected_uri = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        "projects+123+locations+us-central1+tensorboards+456+experiments+"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 6.65μs -> 5.24μs (26.8% faster)

def test_edge_tensorboard_resource_name_with_special_characters():
    # Should handle special characters in resource names
    tensorboard_resource_name = "projects/!@#/locations/$$/tensorboards/%%%^^^"
    custom_job_resource_name = "projects/!@#/locations/$$/customJobs/&&&***"
    expected_uri = (
        "https://$$.tensorboard.googleusercontent.com/experiment/"
        "projects+!@#+locations+$$+tensorboards+%%%^^^+experiments+&&&***"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 6.09μs -> 4.72μs (28.9% faster)

def test_edge_tensorboard_resource_name_with_spaces():
    tensorboard_resource_name = "projects/123 456/locations/us-central1/tensorboards/abc def"
    custom_job_resource_name = "projects/123 456/locations/us-central1/customJobs/ghi jkl"
    expected_uri = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        "projects+123 456+locations+us-central1+tensorboards+abc def+experiments+ghi jkl"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 6.09μs -> 5.03μs (21.1% faster)

def test_edge_tensorboard_resource_name_with_unicode():
    tensorboard_resource_name = "projects/项目/locations/中央/tensorboards/板"
    custom_job_resource_name = "projects/项目/locations/中央/customJobs/作业"
    expected_uri = (
        "https://中央.tensorboard.googleusercontent.com/experiment/"
        "projects+项目+locations+中央+tensorboards+板+experiments+作业"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 7.85μs -> 6.38μs (23.1% faster)

def test_edge_custom_job_resource_name_with_long_id():
    # Very long custom job id (edge case for string handling)
    long_id = "a" * 255
    tensorboard_resource_name = "projects/123/locations/us-central1/tensorboards/456"
    custom_job_resource_name = f"projects/123/locations/us-central1/customJobs/{long_id}"
    expected_uri = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        f"projects+123+locations+us-central1+tensorboards+456+experiments+{long_id}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 6.21μs -> 5.01μs (24.0% faster)

# 3. Large Scale Test Cases

def test_large_scale_many_resource_names():
    # Test with many different resource names for scalability
    for i in range(100):  # keep under 1000 for performance
        tensorboard_resource_name = f"projects/proj{i}/locations/loc{i}/tensorboards/tb{i}"
        custom_job_resource_name = f"projects/proj{i}/locations/loc{i}/customJobs/job{i}"
        expected_uri = (
            f"https://loc{i}.tensorboard.googleusercontent.com/experiment/"
            f"projects+proj{i}+locations+loc{i}+tensorboards+tb{i}+experiments+job{i}"
        )
        codeflash_output = custom_job_tensorboard_console_uri(
            tensorboard_resource_name, custom_job_resource_name
        ) # 167μs -> 147μs (13.9% faster)

def test_large_scale_long_tensorboard_and_custom_job_ids():
    # Test with long tensorboard and custom job ids
    for i in range(10):  # keep small for performance
        long_tb_id = "tb" + "X" * 200 + str(i)
        long_job_id = "job" + "Y" * 200 + str(i)
        tensorboard_resource_name = f"projects/proj/locations/loc/tensorboards/{long_tb_id}"
        custom_job_resource_name = f"projects/proj/locations/loc/customJobs/{long_job_id}"
        expected_uri = (
            f"https://loc.tensorboard.googleusercontent.com/experiment/"
            f"projects+proj+locations+loc+tensorboards+{long_tb_id}+experiments+{long_job_id}"
        )
        codeflash_output = custom_job_tensorboard_console_uri(
            tensorboard_resource_name, custom_job_resource_name
        ) # 41.0μs -> 37.8μs (8.59% faster)

def test_large_scale_all_ascii_printable_characters_in_ids():
    # Use all printable ASCII characters in ids
    import string
    chars = string.ascii_letters + string.digits + string.punctuation
    tensorboard_resource_name = f"projects/{chars}/locations/{chars}/tensorboards/{chars}"
    custom_job_resource_name = f"projects/{chars}/locations/{chars}/customJobs/{chars}"
    expected_uri = (
        f"https://{chars}.tensorboard.googleusercontent.com/experiment/"
        f"projects+{chars}+locations+{chars}+tensorboards+{chars}+experiments+{chars}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 8.56μs -> 7.33μs (16.7% faster)

def test_large_scale_ids_with_maximum_length():
    # Maximum length for resource segments (simulate GCP limits, e.g., 63 chars per segment)
    max_segment = "z" * 63
    tensorboard_resource_name = f"projects/{max_segment}/locations/{max_segment}/tensorboards/{max_segment}"
    custom_job_resource_name = f"projects/{max_segment}/locations/{max_segment}/customJobs/{max_segment}"
    expected_uri = (
        f"https://{max_segment}.tensorboard.googleusercontent.com/experiment/"
        f"projects+{max_segment}+locations+{max_segment}+tensorboards+{max_segment}+experiments+{max_segment}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(
        tensorboard_resource_name, custom_job_resource_name
    ) # 7.18μs -> 6.04μs (19.0% faster)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
import abc
from typing import Callable, Dict, List, Optional, Tuple

# imports
import pytest  # used for our unit tests
from aiplatform.utils.console_utils import custom_job_tensorboard_console_uri


# Dummy classes/functions to allow the test to run (since we don't have the real google.cloud.aiplatform)
class DummyTensorboard:
    @staticmethod
    def _parse_resource_name(resource_name: str) -> Dict[str, str]:
        # Example: "projects/123/locations/us-central1/tensorboards/456"
        # splits into {'project': '123', 'location': 'us-central1', 'tensorboard': '456'}
        parts = resource_name.split("/")
        if len(parts) >= 6:
            return {'project': parts[1], 'location': parts[3], 'tensorboard': parts[5]}
        elif len(parts) >= 4:
            return {'project': parts[1], 'location': parts[3]}
        else:
            return {}

# Patch for tensorboard.Tensorboard
class tensorboard:
    Tensorboard = DummyTensorboard
from aiplatform.utils.console_utils import custom_job_tensorboard_console_uri

# unit tests

# -------------------- BASIC TEST CASES --------------------

def test_basic_valid_inputs():
    # Test with normal, valid resource names
    tensorboard_resource = "projects/123/locations/us-central1/tensorboards/456"
    custom_job_resource = "projects/123/locations/us-central1/customJobs/789"
    expected = (
        "https://us-central1.tensorboard.googleusercontent.com/experiment/"
        "projects+123+locations+us-central1+tensorboards+456+experiments+789"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.41μs -> 4.44μs (21.8% faster)

def test_basic_different_location():
    # Test with different location
    tensorboard_resource = "projects/abc/locations/europe-west4/tensorboards/xyz"
    custom_job_resource = "projects/abc/locations/europe-west4/customJobs/555"
    expected = (
        "https://europe-west4.tensorboard.googleusercontent.com/experiment/"
        "projects+abc+locations+europe-west4+tensorboards+xyz+experiments+555"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.52μs -> 4.54μs (21.7% faster)

def test_basic_custom_job_id_with_letters():
    # Test with custom job ID containing letters and numbers
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "projects/1/locations/loc/customJobs/jobABC123"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+jobABC123"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.42μs -> 4.31μs (25.6% faster)

def test_basic_tensorboard_id_with_letters():
    # Test with tensorboard ID containing letters
    tensorboard_resource = "projects/1/locations/loc/tensorboards/tbXYZ"
    custom_job_resource = "projects/1/locations/loc/customJobs/123"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+tbXYZ+experiments+123"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.37μs -> 4.34μs (23.7% faster)

# -------------------- EDGE TEST CASES --------------------

def test_edge_custom_job_resource_name_short():
    # Test with minimal custom job resource name
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "customJobs/123"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+123"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.01μs -> 4.14μs (21.2% faster)

def test_edge_tensorboard_resource_name_short():
    # Test with minimal tensorboard resource name
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "projects/1/locations/loc/customJobs/789"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+789"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.09μs -> 4.14μs (23.0% faster)

def test_edge_custom_job_resource_name_with_extra_slashes():
    # Test with custom job resource name having trailing slash
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "projects/1/locations/loc/customJobs/789/"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+"
    )
    # The split('/')[-1] will be empty due to trailing slash
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.42μs -> 4.35μs (24.4% faster)



def test_edge_invalid_tensorboard_resource_format():
    # Test with invalid tensorboard resource name format
    tensorboard_resource = "invalid_resource_name"
    custom_job_resource = "projects/1/locations/loc/customJobs/789"
    # The parser returns {}, so KeyError on 'location'
    with pytest.raises(KeyError):
        custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 7.53μs -> 5.19μs (45.0% faster)

def test_edge_custom_job_resource_name_no_slash():
    # Test with custom job resource name that has no slashes
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "789"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+789"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 6.69μs -> 5.13μs (30.6% faster)

def test_edge_custom_job_resource_name_with_special_chars():
    # Test with custom job resource name containing special characters
    tensorboard_resource = "projects/1/locations/loc/tensorboards/2"
    custom_job_resource = "projects/1/locations/loc/customJobs/job_!@#"
    expected = (
        "https://loc.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc+tensorboards+2+experiments+job_!@#"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.93μs -> 4.68μs (26.7% faster)

def test_edge_tensorboard_resource_name_with_special_chars():
    # Test with tensorboard resource name containing special characters
    tensorboard_resource = "projects/1/locations/loc-1/tensorboards/tb-!@#"
    custom_job_resource = "projects/1/locations/loc-1/customJobs/789"
    expected = (
        "https://loc-1.tensorboard.googleusercontent.com/experiment/"
        "projects+1+locations+loc-1+tensorboards+tb-!@#+experiments+789"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 6.04μs -> 4.85μs (24.7% faster)

# -------------------- LARGE SCALE TEST CASES --------------------

def test_large_scale_long_resource_names():
    # Test with very long resource names (but still under 1000 elements)
    long_project = "p" * 200
    long_location = "loc" * 100
    long_tensorboard = "tb" * 100
    long_custom_job = "job" * 100
    tensorboard_resource = f"projects/{long_project}/locations/{long_location}/tensorboards/{long_tensorboard}"
    custom_job_resource = f"projects/{long_project}/locations/{long_location}/customJobs/{long_custom_job}"
    expected = (
        f"https://{long_location}.tensorboard.googleusercontent.com/experiment/"
        f"projects+{long_project}+locations+{long_location}+tensorboards+{long_tensorboard}+experiments+{long_custom_job}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 12.7μs -> 11.5μs (10.5% faster)

def test_large_scale_many_different_ids():
    # Test with multiple different IDs in a loop (but < 1000)
    for i in range(10):  # keep it small for test speed
        tensorboard_resource = f"projects/proj{i}/locations/loc{i}/tensorboards/tb{i}"
        custom_job_resource = f"projects/proj{i}/locations/loc{i}/customJobs/job{i}"
        expected = (
            f"https://loc{i}.tensorboard.googleusercontent.com/experiment/"
            f"projects+proj{i}+locations+loc{i}+tensorboards+tb{i}+experiments+job{i}"
        )
        codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 21.2μs -> 18.1μs (17.4% faster)

def test_large_scale_resource_names_with_max_length_ids():
    # Test with IDs at the maximum reasonable length (but under 1000 chars)
    max_id = "x" * 250
    tensorboard_resource = f"projects/{max_id}/locations/{max_id}/tensorboards/{max_id}"
    custom_job_resource = f"projects/{max_id}/locations/{max_id}/customJobs/{max_id}"
    expected = (
        f"https://{max_id}.tensorboard.googleusercontent.com/experiment/"
        f"projects+{max_id}+locations+{max_id}+tensorboards+{max_id}+experiments+{max_id}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 12.6μs -> 11.4μs (10.1% faster)

def test_large_scale_resource_names_with_numeric_ids():
    # Test with numeric IDs of increasing length
    for i in range(1, 11):
        num_id = str(10 ** i)
        tensorboard_resource = f"projects/{num_id}/locations/{num_id}/tensorboards/{num_id}"
        custom_job_resource = f"projects/{num_id}/locations/{num_id}/customJobs/{num_id}"
        expected = (
            f"https://{num_id}.tensorboard.googleusercontent.com/experiment/"
            f"projects+{num_id}+locations+{num_id}+tensorboards+{num_id}+experiments+{num_id}"
        )
        codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 25.2μs -> 22.1μs (14.1% faster)

def test_large_scale_resource_names_with_various_characters():
    # Test with IDs containing a mix of allowed characters
    chars = "abc-XYZ_123"
    tensorboard_resource = f"projects/{chars}/locations/{chars}/tensorboards/{chars}"
    custom_job_resource = f"projects/{chars}/locations/{chars}/customJobs/{chars}"
    expected = (
        f"https://{chars}.tensorboard.googleusercontent.com/experiment/"
        f"projects+{chars}+locations+{chars}+tensorboards+{chars}+experiments+{chars}"
    )
    codeflash_output = custom_job_tensorboard_console_uri(tensorboard_resource, custom_job_resource) # 5.38μs -> 4.36μs (23.5% faster)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.

To edit these changes git checkout codeflash/optimize-custom_job_tensorboard_console_uri-mgloopc6 and push.

Codeflash

The optimization achieves a **16% speedup** by adding **method lookup caching** to the `_parse_resource_name` function in the `VertexAiResourceNoun` class.

**Key Optimization:**
- Added `@lru_cache(maxsize=32)` to a new helper function `_get_parse_resource_name_method_for_cls()` that caches the expensive method lookup: `getattr(cls.client_class.get_gapic_client_class(), cls._parse_resource_name_method)`
- The original code performed this complex attribute resolution chain on every call, taking ~7581ns per hit
- The cached version reduces this to just ~475ns per hit for cache hits

**Why This Works:**
The method lookup involves traversing multiple object attributes (`cls.client_class.get_gapic_client_class()`) which is computationally expensive. Since the same class typically calls `_parse_resource_name` repeatedly with the same method resolution, caching eliminates this redundant work.

**Performance Impact:**
- Line profiler shows the method lookup time dropped from 100% of function time to just 6.7%
- The actual parsing work (`method(resource_name)`) remains unchanged at ~93.3% of function time
- Test results show consistent 13-45% improvements across various test cases, with larger gains on edge cases that hit the cache more frequently

**Minor Secondary Optimization:**
In `console_utils.py`, extracted `custom_job_resource_name.split('/')[-1]` to a variable to avoid duplicate string splitting, providing small additional gains (2-4μs improvements in tests).

This optimization is particularly effective for applications that parse many resource names with the same class types, as subsequent calls benefit from the cached method lookup.
@codeflash-ai codeflash-ai bot requested a review from mashraf-222 October 11, 2025 02:56
@codeflash-ai codeflash-ai bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Oct 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚡️ codeflash Optimization PR opened by Codeflash AI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant