Skip to content

⚡️ Speed up function _args_reference_urls by 25% in PR #10727 (feat/http-stream-mcp)#10925

Closed
codeflash-ai[bot] wants to merge 155 commits into
mainfrom
codeflash/optimize-pr10727-2025-12-08T15.44.55
Closed

⚡️ Speed up function _args_reference_urls by 25% in PR #10727 (feat/http-stream-mcp)#10925
codeflash-ai[bot] wants to merge 155 commits into
mainfrom
codeflash/optimize-pr10727-2025-12-08T15.44.55

Conversation

@codeflash-ai
Copy link
Copy Markdown
Contributor

@codeflash-ai codeflash-ai Bot commented Dec 8, 2025

⚡️ This pull request contains optimizations for PR #10727

If you approve this dependent PR, these changes will be merged into the original PR branch feat/http-stream-mcp.

This PR will be automatically closed if the original PR is merged.


📄 25% (0.25x) speedup for _args_reference_urls in src/backend/base/langflow/api/v1/mcp_projects.py

⏱️ Runtime : 1.00 millisecond 802 microseconds (best of 5 runs)

📝 Explanation and details

The optimization transforms the function from a set intersection approach to an early-exit loop pattern, providing a 25% speedup.

Key optimizations:

  1. Pre-convert URLs to set: urls_set = set(urls) enables O(1) lookups instead of repeated linear searches through the list.

  2. Early exit on first match: The loop immediately returns True when finding the first matching string argument, avoiding unnecessary iteration through remaining args.

  3. Eliminate temporary set creation: The original code builds a complete set of all string arguments {arg for arg in args if isinstance(arg, str)} before checking intersection, which wastes memory and CPU cycles.

Performance characteristics:

  • Best case improvement: When matches occur early in the args sequence, the optimized version can terminate immediately instead of processing all arguments
  • Memory efficiency: Avoids creating a potentially large temporary set of string arguments
  • Consistent improvement: Even when no matches exist, the optimized version performs fewer operations per iteration

Test case analysis shows the optimization excels when:

  • Args contain early matches (exits immediately)
  • Large argument lists with mixed types (avoids building full string sets)
  • No matches exist (more efficient per-iteration checks)
  • Multiple matches present (stops at first rather than finding all)

The line profiler confirms this: the original spends 93.8% of time in the set comprehension + intersection, while the optimized version distributes work more efficiently across the loop with early termination capability.

Correctness verification report:

Test Status
⚙️ Existing Unit Tests 🔘 None Found
🌀 Generated Regression Tests 78 Passed
⏪ Replay Tests 🔘 None Found
🔎 Concolic Coverage Tests 🔘 None Found
📊 Tests Coverage 100.0%
🌀 Generated Regression Tests and Runtime
from collections.abc import Sequence
from typing import Any, Sequence

# imports
import pytest  # used for our unit tests
from langflow.api.v1.mcp_projects import _args_reference_urls

# unit tests

# ------------------------
# Basic Test Cases
# ------------------------

def test_basic_single_match():
    # One arg matches one url
    args = ["http://example.com"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_multiple_args_one_match():
    # Multiple args, one matches
    args = ["foo", "bar", "http://example.com"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_multiple_args_multiple_matches():
    # Multiple args, multiple matches
    args = ["foo", "http://a.com", "http://b.com", "baz"]
    urls = ["http://b.com", "http://c.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_no_match():
    # Args and urls have no intersection
    args = ["foo", "bar", "baz"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_empty_args():
    # Args is empty
    args = []
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_empty_urls():
    # Urls is empty
    args = ["foo", "http://example.com"]
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_none_args():
    # Args is None
    args = None
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_none_urls():
    # URLs is None (should be handled as empty per function signature)
    args = ["foo", "bar"]
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_multiple_urls_one_match():
    # Multiple urls, one matches
    args = ["foo", "bar", "http://example.com"]
    urls = ["http://a.com", "http://example.com", "http://b.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_basic_multiple_urls_no_match():
    # Multiple urls, none match
    args = ["foo", "bar"]
    urls = ["http://a.com", "http://b.com"]
    codeflash_output = _args_reference_urls(args, urls)

# ------------------------
# Edge Test Cases
# ------------------------

def test_edge_args_with_non_str_types():
    # Args contains non-string types
    args = ["foo", 123, None, "http://example.com", 4.5]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_urls_with_duplicates():
    # URLs contains duplicates
    args = ["foo", "bar", "http://dup.com"]
    urls = ["http://dup.com", "http://dup.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_with_duplicates():
    # Args contains duplicates
    args = ["http://dup.com", "http://dup.com", "foo"]
    urls = ["http://dup.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_all_non_str():
    # Args is all non-string types
    args = [1, 2.0, None, [], {}]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_and_urls_overlap_subset():
    # Args and urls have partial overlap
    args = ["http://a.com", "http://b.com", "foo"]
    urls = ["http://b.com", "http://c.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_case_sensitive():
    # URLs are case sensitive
    args = ["HTTP://EXAMPLE.COM"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_empty_string_in_args():
    # Args contains empty string
    args = ["", "foo", "bar"]
    urls = [""]
    codeflash_output = _args_reference_urls(args, urls)  # "" matches ""

def test_edge_empty_string_in_urls():
    # URLs contains empty string, but args does not
    args = ["foo", "bar"]
    urls = [""]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_tuple_type():
    # Args is a tuple instead of a list
    args = ("foo", "http://example.com")
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_urls_with_non_str_types():
    # URLs contains non-string types (should not match)
    args = ["foo", "bar"]
    urls = [None, 123, 4.5]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_urls_with_mixed_types_and_match():
    # URLs contains both strings and non-strings, with a match
    args = ["foo", "bar"]
    urls = [None, "bar", 123]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_with_whitespace_strings():
    # Args contains whitespace string
    args = ["   ", "foo"]
    urls = ["   "]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_urls_with_whitespace_strings():
    # URLs contains whitespace string, but args does not
    args = ["foo", "bar"]
    urls = ["   "]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_with_special_characters():
    # Args contains special characters
    args = ["foo$", "bar#", "http://example.com/?a=1&b=2"]
    urls = ["http://example.com/?a=1&b=2"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_and_urls_both_empty():
    # Both args and urls are empty
    args = []
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_none_urls_empty():
    # Args is None, urls is empty
    args = None
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_empty_urls_none():
    # Args is empty, urls is empty (should be treated as no match)
    args = []
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_contains_url_as_substring():
    # Args contains string with url as substring (should not match)
    args = ["foohttp://example.combar"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_edge_args_and_urls_are_same_object():
    # Args and urls point to the same list object
    shared = ["http://example.com"]
    codeflash_output = _args_reference_urls(shared, shared)

def test_edge_args_and_urls_with_none_inside():
    # Both args and urls contain None
    args = ["foo", None]
    urls = [None, "bar"]
    codeflash_output = _args_reference_urls(args, urls)

# ------------------------
# Large Scale Test Cases
# ------------------------

def test_large_scale_no_match():
    # Large number of args and urls, no matches
    args = [f"foo{i}" for i in range(1000)]
    urls = [f"http://bar{i}.com" for i in range(1000)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_one_match():
    # Large number of args and urls, one match
    args = [f"foo{i}" for i in range(999)] + ["http://match.com"]
    urls = [f"http://bar{i}.com" for i in range(999)] + ["http://match.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_all_match():
    # All args are in urls
    args = [f"http://foo{i}.com" for i in range(500)]
    urls = [f"http://foo{i}.com" for i in range(500)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_half_match():
    # Half of args match urls
    args = [f"http://foo{i}.com" for i in range(500)] + [f"bar{i}" for i in range(500)]
    urls = [f"http://foo{i}.com" for i in range(500)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_args_with_non_str_types():
    # Large args list with mixed types, one match
    args = [i for i in range(500)] + ["http://match.com"]
    urls = ["http://match.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_urls_with_non_str_types():
    # Large urls list with mixed types, one match
    args = ["http://match.com"]
    urls = [i for i in range(500)] + ["http://match.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_all_non_str_args():
    # Large args list, all non-string
    args = [i for i in range(1000)]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_empty_args():
    # Large urls, empty args
    args = []
    urls = [f"http://foo{i}.com" for i in range(1000)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_empty_urls():
    # Large args, empty urls
    args = [f"http://foo{i}.com" for i in range(1000)]
    urls = []
    codeflash_output = _args_reference_urls(args, urls)

def test_large_scale_args_urls_overlap_at_end():
    # Overlap only at the end
    args = [f"foo{i}" for i in range(999)] + ["http://last.com"]
    urls = [f"http://bar{i}.com" for i in range(999)] + ["http://last.com"]
    codeflash_output = _args_reference_urls(args, urls)
# codeflash_output is used to check that the output of the original code is the same as that of the optimized code.
#------------------------------------------------
from collections.abc import Sequence
from typing import Any

# imports
import pytest  # used for our unit tests
from langflow.api.v1.mcp_projects import _args_reference_urls

# unit tests

# --- Basic Test Cases ---

def test_args_and_urls_empty():
    # Both args and urls are empty
    codeflash_output = _args_reference_urls([], [])

def test_args_empty_urls_nonempty():
    # Args is empty, urls is not
    codeflash_output = _args_reference_urls([], ["http://example.com"])

def test_args_nonempty_urls_empty():
    # Args is not empty, urls is empty
    codeflash_output = _args_reference_urls(["http://example.com"], [])

def test_args_none():
    # Args is None, urls is non-empty
    codeflash_output = _args_reference_urls(None, ["http://example.com"])

def test_urls_none_equivalent():
    # URLs is empty, args is non-empty
    codeflash_output = _args_reference_urls(["http://example.com"], [])

def test_single_match():
    # One arg matches one url
    codeflash_output = _args_reference_urls(["http://example.com"], ["http://example.com"])

def test_single_no_match():
    # One arg does not match url
    codeflash_output = _args_reference_urls(["http://notfound.com"], ["http://example.com"])

def test_multiple_args_one_match():
    # Multiple args, one matches
    codeflash_output = _args_reference_urls(
        ["foo", "bar", "http://example.com"], ["http://example.com"]
    )

def test_multiple_args_no_match():
    # Multiple args, none match
    codeflash_output = _args_reference_urls(
        ["foo", "bar", "baz"], ["http://example.com"]
    )

def test_multiple_urls_one_match():
    # Multiple urls, one matches
    codeflash_output = _args_reference_urls(
        ["http://foo.com", "http://bar.com"],
        ["http://baz.com", "http://bar.com"]
    )

def test_multiple_urls_no_match():
    # Multiple urls, none match
    codeflash_output = _args_reference_urls(
        ["http://foo.com", "http://bar.com"],
        ["http://baz.com", "http://qux.com"]
    )

def test_duplicate_args():
    # Duplicated arg, matches url
    codeflash_output = _args_reference_urls(
        ["http://dup.com", "http://dup.com"], ["http://dup.com"]
    )

def test_duplicate_urls():
    # Duplicated url, matches arg
    codeflash_output = _args_reference_urls(
        ["http://dup.com"], ["http://dup.com", "http://dup.com"]
    )

def test_type_non_str_args_ignored():
    # Non-string args are ignored
    codeflash_output = _args_reference_urls(
        ["http://example.com", 123, None, {"url": "http://example.com"}],
        ["http://example.com"]
    )

def test_type_non_str_args_only():
    # Only non-string args: should return False
    codeflash_output = _args_reference_urls(
        [123, None, {"url": "http://example.com"}],
        ["http://example.com"]
    )

def test_url_substring_not_match():
    # Substring is not a match
    codeflash_output = _args_reference_urls(
        ["example.com"],
        ["http://example.com"]
    )

def test_url_case_sensitive():
    # Case sensitivity: should not match
    codeflash_output = _args_reference_urls(
        ["HTTP://EXAMPLE.COM"],
        ["http://example.com"]
    )

def test_url_case_exact():
    # Case sensitivity: should match if exact
    codeflash_output = _args_reference_urls(
        ["http://example.com"],
        ["http://example.com"]
    )

# --- Edge Test Cases ---

def test_args_with_empty_string():
    # Args contains empty string, urls non-empty
    codeflash_output = _args_reference_urls([""], ["http://example.com"])

def test_urls_with_empty_string():
    # URLs contains empty string, args non-empty
    codeflash_output = _args_reference_urls(["http://example.com"], [""])

def test_args_with_whitespace_string():
    # Args contains whitespace string, urls non-empty
    codeflash_output = _args_reference_urls(["   "], ["http://example.com"])

def test_urls_with_whitespace_string():
    # URLs contains whitespace string, args non-empty
    codeflash_output = _args_reference_urls(["http://example.com"], ["   "])

def test_args_with_none_inside():
    # Args contains None, but also a valid matching string
    codeflash_output = _args_reference_urls([None, "http://example.com"], ["http://example.com"])

def test_args_with_similar_but_not_equal():
    # Args contains a string similar but not equal to url
    codeflash_output = _args_reference_urls(
        ["http://example.com/"],
        ["http://example.com"]
    )

def test_args_with_leading_trailing_spaces():
    # Args contains string with leading/trailing spaces
    codeflash_output = _args_reference_urls(
        [" http://example.com "],
        ["http://example.com"]
    )

def test_urls_with_leading_trailing_spaces():
    # URLs contains string with leading/trailing spaces
    codeflash_output = _args_reference_urls(
        ["http://example.com"],
        [" http://example.com "]
    )

def test_args_with_tuple():
    # Args is a tuple instead of list
    codeflash_output = _args_reference_urls(
        ("http://example.com",), ["http://example.com"]
    )


def test_urls_with_duplicates_and_match():
    # URLs contains duplicates and a matching value
    codeflash_output = _args_reference_urls(
        ["http://example.com"],
        ["http://example.com", "http://example.com"]
    )

def test_args_with_long_string():
    # Args contains a very long string
    long_url = "http://" + "a" * 500 + ".com"
    codeflash_output = _args_reference_urls([long_url], [long_url])

def test_args_and_urls_with_special_characters():
    # Args and URLs with special characters
    url = "http://example.com/?q=hello%20world&x=1"
    codeflash_output = _args_reference_urls([url], [url])

def test_args_and_urls_with_unicode():
    # Args and URLs with unicode characters
    url = "http://exämple.com/ü"
    codeflash_output = _args_reference_urls([url], [url])

def test_args_with_falsy_non_str():
    # Args contains falsy non-str values (0, False)
    codeflash_output = _args_reference_urls([0, False], ["0", "False"])

# --- Large Scale Test Cases ---

def test_large_number_of_args_and_urls_one_match():
    # Large number of args and urls, one match
    urls = [f"http://site{i}.com" for i in range(1000)]
    args = [f"http://foo{i}.com" for i in range(1000)]
    args[500] = "http://site777.com"
    codeflash_output = _args_reference_urls(args, urls)

def test_large_number_of_args_and_urls_no_match():
    # Large number of args and urls, no match
    urls = [f"http://site{i}.com" for i in range(1000)]
    args = [f"http://foo{i}.com" for i in range(1000)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_number_of_args_with_non_str_types():
    # Large number of args, mostly non-str, but one matches
    args = [None] * 999 + ["http://example.com"]
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_number_of_urls_with_duplicates():
    # Large number of urls with duplicates, one match
    urls = ["http://example.com"] * 1000
    args = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_number_of_args_and_urls_all_match():
    # All args match all urls
    urls = [f"http://site{i}.com" for i in range(1000)]
    args = [f"http://site{i}.com" for i in range(1000)]
    codeflash_output = _args_reference_urls(args, urls)

def test_large_number_of_args_all_non_str():
    # All args are non-str types
    args = [None] * 1000
    urls = ["http://example.com"]
    codeflash_output = _args_reference_urls(args, urls)
# 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-pr10727-2025-12-08T15.44.55 and push.

Codeflash

HzaRashid and others added 30 commits November 27, 2025 04:01
fix tests

refactor mcp and mcp_projects

backwards compat with SSE transport

provide streamable http option for json mcp config

remove streamable_http mgmt and update tests
fix tests

refactor mcp and mcp_projects

backwards compat with SSE transport

provide streamable http option for json mcp config

remove streamable_http mgmt and update tests
HzaRashid and others added 21 commits December 3, 2025 22:26
The optimization transforms the function from a set intersection approach to an early-exit loop pattern, providing a **25% speedup**.

**Key optimizations:**

1. **Pre-convert URLs to set**: `urls_set = set(urls)` enables O(1) lookups instead of repeated linear searches through the list.

2. **Early exit on first match**: The loop immediately returns `True` when finding the first matching string argument, avoiding unnecessary iteration through remaining args.

3. **Eliminate temporary set creation**: The original code builds a complete set of all string arguments `{arg for arg in args if isinstance(arg, str)}` before checking intersection, which wastes memory and CPU cycles.

**Performance characteristics:**

- **Best case improvement**: When matches occur early in the args sequence, the optimized version can terminate immediately instead of processing all arguments
- **Memory efficiency**: Avoids creating a potentially large temporary set of string arguments
- **Consistent improvement**: Even when no matches exist, the optimized version performs fewer operations per iteration

**Test case analysis shows the optimization excels when:**

- Args contain early matches (exits immediately)
- Large argument lists with mixed types (avoids building full string sets)
- No matches exist (more efficient per-iteration checks)
- Multiple matches present (stops at first rather than finding all)

The line profiler confirms this: the original spends 93.8% of time in the set comprehension + intersection, while the optimized version distributes work more efficiently across the loop with early termination capability.
@codeflash-ai codeflash-ai Bot added the ⚡️ codeflash Optimization PR opened by Codeflash AI label Dec 8, 2025
@github-actions github-actions Bot added the community Pull Request from an external contributor label Dec 8, 2025
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 8, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov Bot commented Dec 8, 2025

Codecov Report

❌ Patch coverage is 68.05195% with 123 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.90%. Comparing base (7fc4208) to head (9ad37cc).
⚠️ Report is 5 commits behind head on main.

Files with missing lines Patch % Lines
src/backend/base/langflow/api/v1/mcp_projects.py 68.91% 60 Missing ⚠️
...ackend/base/langflow/api/utils/mcp/config_utils.py 36.11% 23 Missing ⚠️
src/backend/base/langflow/api/v1/mcp.py 83.56% 12 Missing ⚠️
...frontend/src/customization/utils/custom-mcp-url.ts 0.00% 12 Missing ⚠️
src/backend/base/langflow/api/v1/mcp_utils.py 76.19% 5 Missing ⚠️
...ages/MainPage/pages/homePage/hooks/useMcpServer.ts 50.00% 0 Missing and 5 partials ⚠️
src/backend/base/langflow/main.py 73.33% 4 Missing ⚠️
src/backend/base/langflow/api/v1/projects.py 50.00% 1 Missing ⚠️
...ontrollers/API/queries/mcp/use-get-composer-url.ts 0.00% 1 Missing ⚠️

❌ Your project status has failed because the head coverage (39.95%) is below the target coverage (60.00%). You can increase the head coverage or adjust the target coverage.

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main   #10925      +/-   ##
==========================================
+ Coverage   32.54%   32.90%   +0.36%     
==========================================
  Files        1371     1371              
  Lines       63544    63857     +313     
  Branches     9397     9406       +9     
==========================================
+ Hits        20679    21015     +336     
+ Misses      41825    41799      -26     
- Partials     1040     1043       +3     
Flag Coverage Δ
backend 52.56% <69.74%> (+1.02%) ⬆️
lfx 39.95% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/backend/base/langflow/api/v1/schemas.py 96.15% <100.00%> (+0.10%) ⬆️
...controllers/API/queries/mcp/use-patch-flows-mcp.ts 0.00% <ø> (ø)
...ntrollers/API/queries/mcp/use-patch-install-mcp.ts 0.00% <ø> (ø)
...ages/homePage/components/McpAutoInstallContent.tsx 80.00% <100.00%> (ø)
...nPage/pages/homePage/components/McpJsonContent.tsx 84.44% <100.00%> (+1.11%) ⬆️
...ainPage/pages/homePage/components/McpServerTab.tsx 91.80% <100.00%> (+0.27%) ⬆️
...s/MainPage/pages/homePage/utils/mcpServerUtils.tsx 93.44% <100.00%> (+0.33%) ⬆️
src/lfx/src/lfx/services/mcp_composer/service.py 57.68% <100.00%> (+0.12%) ⬆️
src/backend/base/langflow/api/v1/projects.py 29.68% <50.00%> (ø)
...ontrollers/API/queries/mcp/use-get-composer-url.ts 0.00% <0.00%> (ø)
... and 7 more

... and 7 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@HzaRashid HzaRashid force-pushed the feat/http-stream-mcp branch from dac5be9 to b943b6e Compare December 8, 2025 18:17
@codeflash-ai codeflash-ai Bot closed this Dec 8, 2025
@codeflash-ai
Copy link
Copy Markdown
Contributor Author

codeflash-ai Bot commented Dec 8, 2025

This PR has been automatically closed because the original PR #10727 by HzaRashid was closed.

Base automatically changed from feat/http-stream-mcp to main December 8, 2025 21:22
@codeflash-ai codeflash-ai Bot deleted the codeflash/optimize-pr10727-2025-12-08T15.44.55 branch December 8, 2025 21:22
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 community Pull Request from an external contributor

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants