Skip to content

[Feature] New structural tag support#10691

Merged
hnyls2002 merged 4 commits intosgl-project:mainfrom
DarkSharpness:stag_v2
Oct 20, 2025
Merged

[Feature] New structural tag support#10691
hnyls2002 merged 4 commits intosgl-project:mainfrom
DarkSharpness:stag_v2

Conversation

@DarkSharpness
Copy link
Collaborator

@DarkSharpness DarkSharpness commented Sep 20, 2025

Motivation

structural tag

Modifications

We support the new structural tag while maintaining backward compatibility with the legacy one.

  1. Rename old StructuralTagResponseFormat to LegacyStructuralTagResponseFormat.
  2. Support new StructuralTag.
  3. Add a simple test on structural tag.

Accuracy Tests

Benchmarking and Profiling

Checklist

Summary by CodeRabbit

  • New Features

    • Expanded structural tag support across the OpenAI-compatible server and XGrammar backend, including compatibility with both legacy and latest formats.
    • Improved tool-call constraint handling for structured outputs and function-like tags.
  • Documentation

    • Added comprehensive notebook examples showing how to request and validate structural-tag outputs, including schema- and tag-triggered flows and end-to-end request payloads.
  • Tests

    • Introduced integration tests validating structural-tag responses (constant strings and JSON schemas) to ensure correct behavior and stability.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @DarkSharpness, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the structural tag support within the system. It introduces a new, more flexible structural tag format while carefully preserving compatibility with the existing legacy format. This is achieved through strategic renaming, the addition of a format detection utility, and updated dispatch logic in the grammar backends. The changes also include improved type safety in the OpenAI protocol and comprehensive new tests to validate the new functionality.

Highlights

  • New Structural Tag Support: Introduced support for a new structural tag format, enhancing flexibility in defining structured outputs.
  • Backward Compatibility: Ensured backward compatibility by renaming the old structural tag format to LegacyStructuralTagResponseFormat and implementing a utility to differentiate between old and new formats.
  • Grammar Backend Updates: Updated llguidance_backend and xgrammar_backend to correctly dispatch and process both legacy and new structural tag formats.
  • Improved Type Safety: Enhanced type hinting in the OpenAI protocol by introducing ToolCallConstraint and updating relevant type annotations for better code clarity and maintainability.
  • New Unit Tests: Added comprehensive unit tests for the new structural tag feature, covering scenarios like constant string and JSON schema formats.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces support for a new structural tag format, ensuring backward compatibility with the old format. The changes are well-structured, including updates to data protocols, backend logic, and the addition of new tests. My review focuses on improving the robustness of the validation logic for structural tags and fixing a potential unhandled exception. I've also pointed out a minor issue in the new test file's documentation for better maintainability.

@DarkSharpness
Copy link
Collaborator Author

Note: this PR needs a newer release of xgrammar

Copy link
Collaborator

@Ubospica Ubospica left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome. Thank you so much for your support.

Could you also add some introductory text to https://docs.sglang.ai/advanced_features/structured_outputs.html#id4? I believe #10497 has updated the doc on examples, but would be great to also talk about what this is and link to the structural tag docs at https://xgrammar.mlc.ai/docs/tutorials/structural_tag.html

@zhyncs zhyncs requested a review from Ubospica September 21, 2025 04:49
@Ubospica
Copy link
Collaborator

New version of xgrammar is released at https://github.com/mlc-ai/xgrammar/releases/tag/v0.1.25

Copy link
Collaborator

@CatherineSue CatherineSue left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we remove the legacy structural tag for all? Or do we need to keep it for llguidace_backend?

@DarkSharpness
Copy link
Collaborator Author

Can we remove the legacy structural tag for all? Or do we need to keep it for llguidace_backend?

I'm not familar with llguidace, so I would keep it for backward compatibility. But I agree we should complete prune it off main branch later.

@Ubospica
Copy link
Collaborator

Ubospica commented Oct 9, 2025

@CatherineSue Thanks for the comment! I think the old structural tag is considered legacy because its functionality is fully covered by the new structural tag. I think we can keep it for a while for compatibility and consider removing it later.

@CatherineSue
Copy link
Collaborator

It seems the Execute Notebook is failing. Can you take a look? @DarkSharpness

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 11, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Adds explicit support and examples for structural_tag formats: introduces legacy vs. latest detection, updates backends to dispatch accordingly, refines OpenAI protocol types and sampling parameters, adjusts function-call parsing to legacy format, and adds tests validating structural_tag behavior via the xgrammar backend. Documentation notebook includes extensive usage examples.

Changes

Cohort / File(s) Summary
Docs: Structured outputs examples
docs/advanced_features/structured_outputs.ipynb
Expanded notebook with multiple code paths demonstrating structural_tag in the “latest” spec, including format/triggered_tags variants, schemas, POST payloads, local server flows, and output inspection.
Constrained utils and backends: legacy detection and dispatch
python/sglang/srt/constrained/utils.py, python/sglang/srt/constrained/llguidance_backend.py, python/sglang/srt/constrained/xgrammar_backend.py
Added is_legacy_structural_tag utility. llguidance now asserts legacy-only handling and returns INVALID on non-legacy. xgrammar backend branches: builds tags from legacy structures+triggers, otherwise compiles from key string.
OpenAI protocol: type aliases and tool-call constraints
python/sglang/srt/entrypoints/openai/protocol.py
Added LegacyStructuralTagResponseFormat, StructuralTagResponseFormat (union), and ToolCallConstraint. Updated method signatures and data fields to use these types; to_sampling_params now accepts ToolCallConstraint.
Function-call parser: legacy structural tag usage
python/sglang/srt/function_call/function_call_parser.py
Switched to LegacyStructuralTagResponseFormat. Updated return types: get_structure_tag and get_structure_constraint now use legacy format and ToolCallConstraint.
Tests: structural_tag via xgrammar backend
test/srt/openai_server/features/test_structural_tag.py
New tests spin up OpenAI-compatible server with xgrammar. Validate constant-string structural_tag and JSON-schema structural_tag responses; include setup/teardown and JSON parsing assertions.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Client as Client
  participant OpenAIAPI as OpenAI-compatible Server
  participant Protocol as Protocol Layer<br/>(ToolCallConstraint)
  participant Parser as FunctionCall Parser
  participant Backend as Constrained Backend<br/>(xgrammar/llguidance)
  participant Compiler as Grammar Compiler

  Client->>OpenAIAPI: chat.completions (response_format=structural_tag)
  OpenAIAPI->>Protocol: Normalize & type-check request
  Protocol-->>OpenAIAPI: ToolCallConstraint (structural_tag or json_schema)

  OpenAIAPI->>Parser: get_structure_constraint(tool_choice)
  Parser-->>OpenAIAPI: ("structural_tag", LegacyStructuralTagResponseFormat)

  OpenAIAPI->>Backend: dispatch_structural_tag(structural_tag)
  alt Legacy format (structures+triggers)
    Backend->>Compiler: compile_structural_tag(tags, triggers)
  else New key string format
    Backend->>Compiler: compile_structural_tag(key_string)
  end
  Compiler-->>Backend: Compiled grammar or INVALID
  Backend-->>OpenAIAPI: Constraint object or INVALID

  OpenAIAPI->>OpenAIAPI: Generate with constraints
  OpenAIAPI-->>Client: Completion (tool-call constrained)
Loading
sequenceDiagram
  autonumber
  participant Client
  participant llguidance as llguidance_backend
  participant Util as utils.is_legacy_structural_tag

  Client->>llguidance: dispatch_structural_tag(structural_tag)
  llguidance->>Util: is_legacy_structural_tag?
  alt Non-legacy
    llguidance-->>Client: INVALID_GRAMMAR_OBJ (assertion path)
  else Legacy
    llguidance-->>Client: Construct StructTag objects (legacy flow)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

I thump my paws at tags so grand,
Old burrows, new tunnels through structured land.
Triggers twitch, schemas gleam,
Xgrammar hums—a bounded dream.
With tests that hop and docs that sing,
I nibble constraints—spring, spring, spring! 🐇✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.77% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title succinctly conveys that this feature PR adds new structural tag support, which is the primary change in the diff. It highlights the main intent without unnecessary detail and uses clear, concise phrasing. The bracketed prefix [Feature] also signals the nature of the update, making the change easy to identify in history.
Description Check ✅ Passed The PR description follows the repository template by providing a Motivation section with context and a Modifications section detailing the renaming and support additions. It retains the Accuracy Tests and Benchmarking headings even though no data is currently provided, which is acceptable for non-critical sections. The checklist is included and formatted correctly, indicating readiness for fulfillment.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

DarkSharpness and others added 3 commits October 12, 2025 01:29
Co-authored-by: Aaron Yee <110548922+aaronyeeio@users.noreply.github.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/advanced_features/structured_outputs.ipynb (1)

252-256: Syntax error: split string literal breaks the tool schema

The "description" for state is split across two lines, leaving a stray string literal and causing a SyntaxError when executing the notebook. Merge into a single line.

-                    "description": "the two-letter abbreviation for the state that the city is"
-                    " in, e.g. 'CA' which would mean 'California'",
+                    "description": "the two-letter abbreviation for the state that the city is in, e.g. 'CA' which would mean 'California'",
python/sglang/srt/constrained/llguidance_backend.py (1)

164-176: Avoid assert for input validation; validate triggers handling

  • Do not use assert for request validation; it can be disabled. Raise ValueError instead.
  • LLGuidance path uses only triggers[0]; either validate a single trigger or support multiple explicitly.
-            structural_tag = json.loads(key_string)
-            assert is_legacy_structural_tag(structural_tag)
+            structural_tag = json.loads(key_string)
+            if not is_legacy_structural_tag(structural_tag):
+                raise ValueError(
+                    "llguidance backend supports only legacy structural_tag (structures+triggers). "
+                    "Use XGrammar backend for the new 'format' variant."
+                )
+            if not structural_tag.get("triggers") or len(structural_tag["triggers"]) != 1:
+                raise ValueError(
+                    "llguidance backend currently requires exactly one trigger."
+                )
             tags = [
                 StructTag(
                     begin=structure["begin"],
                     grammar=structure["schema"],
                     end=structure["end"],
-                    trigger=structural_tag["triggers"][0],  # TODO?
+                    trigger=structural_tag["triggers"][0],
                 )
                 for structure in structural_tag["structures"]
             ]
             g = StructTag.to_grammar(tags)
             return self._from_serialized(g)
-        except Exception as e:
+        except (ValueError, Exception) as e:
             logging.error(f"Hit invalid structural_tag: {key_string=}, {e=}")
             return INVALID_GRAMMAR_OBJ
♻️ Duplicate comments (2)
python/sglang/srt/constrained/xgrammar_backend.py (1)

245-261: Handle ValueError, and guard optional schema

Catching ValueError keeps this aligned with stricter validation. Also default schema to {} if missing.

-            structural_tag = json.loads(key_string)
+            structural_tag = json.loads(key_string)
             if is_legacy_structural_tag(structural_tag):
                 tags = [
                     StructuralTagItem(
                         begin=structure["begin"],
-                        schema=json.dumps(structure["schema"]),
+                        schema=json.dumps(structure.get("schema") or {}),
                         end=structure["end"],
                     )
                     for structure in structural_tag["structures"]
                 ]
                 ctx = self.grammar_compiler.compile_structural_tag(
                     tags, structural_tag["triggers"]
                 )
             else:
                 ctx = self.grammar_compiler.compile_structural_tag(key_string)
-        except (RuntimeError, json.decoder.JSONDecodeError) as e:
+        except (RuntimeError, json.decoder.JSONDecodeError, ValueError) as e:
             logging.error(f"Hit invalid structural_tag: {key_string=}, {e=}")
             return INVALID_GRAMMAR_OBJ
python/sglang/srt/constrained/utils.py (1)

7-12: Replace asserts with explicit validation (robust under -O)

Use explicit checks and raise ValueError for malformed structural_tag objects. This avoids disabled-assert pitfalls.

-    if obj.get("structures", None) is not None:
-        assert obj.get("triggers", None) is not None
-        return True
-    else:
-        assert obj.get("format", None) is not None
-        return False
+    if obj.get("structures") is not None:
+        if obj.get("triggers") is None:
+            raise ValueError(
+                "Legacy structural_tag with 'structures' must also include 'triggers'."
+            )
+        return True
+    if obj.get("format") is None:
+        raise ValueError("New structural_tag must include a 'format' key.")
+    return False
🧹 Nitpick comments (5)
docs/advanced_features/structured_outputs.ipynb (1)

641-690: Add timeout to requests.post

Examples should include a reasonable timeout to avoid hanging in docs.

- response = requests.post(f"http://localhost:{port}/generate", json=payload)
+ response = requests.post(f"http://localhost:{port}/generate", json=payload, timeout=30)
python/sglang/srt/function_call/function_call_parser.py (1)

154-160: Deterministic trigger ordering

Sets are unordered; convert to a sorted list to avoid nondeterministic payloads and flaky tests.

-        return LegacyStructuralTagResponseFormat(
+        return LegacyStructuralTagResponseFormat(
             type="structural_tag",
             structures=tool_structures,
-            triggers=list(tool_trigger_set),
+            triggers=sorted(tool_trigger_set),
         )
python/sglang/srt/entrypoints/openai/protocol.py (2)

639-642: Robust serialization for StructuralTag (dict/dataclass/Pydantic)

Don’t assume .model_dump; support dict or dataclass objects too.

-            sampling_params["structural_tag"] = convert_json_schema_to_str(
-                self.response_format.model_dump(by_alias=True)
-            )
+            obj = self.response_format
+            payload = (
+                obj.model_dump(by_alias=True) if hasattr(obj, "model_dump")
+                else (obj if isinstance(obj, dict) else getattr(obj, "__dict__", obj))
+            )
+            sampling_params["structural_tag"] = convert_json_schema_to_str(payload)

654-662: Apply same robust handling to tool_call_constraint

Mirror the above when injecting structural_tag from tool_call_constraint.

-            if constraint_type == "structural_tag":
-                sampling_params[constraint_type] = convert_json_schema_to_str(
-                    constraint_value.model_dump(by_alias=True)
-                )
+            if constraint_type == "structural_tag":
+                obj = constraint_value
+                payload = (
+                    obj.model_dump(by_alias=True) if hasattr(obj, "model_dump")
+                    else (obj if isinstance(obj, dict) else getattr(obj, "__dict__", obj))
+                )
+                sampling_params[constraint_type] = convert_json_schema_to_str(payload)
test/srt/openai_server/features/test_structural_tag.py (1)

82-122: Consider validating additional schema constraints.

The test validates the types of returned fields but doesn't verify:

  • The pattern constraint ^[\\w]+$ on the name field
  • That no additional properties exist (as specified by additionalProperties: False)
  • That required fields are actually present

While the current type checks are sufficient for basic validation, adding these assertions would provide more comprehensive test coverage for the structural_tag feature.

Example enhancement:

        js_obj = json.loads(text)
        
        # Validate required fields
        self.assertIn("name", js_obj)
        self.assertIn("population", js_obj)
        
        # Validate types
        self.assertIsInstance(js_obj["name"], str)
        self.assertIsInstance(js_obj["population"], int)
        
        # Validate pattern constraint
        import re
        self.assertRegex(js_obj["name"], r"^[\w]+$")
        
        # Validate no additional properties
        self.assertEqual(set(js_obj.keys()), {"name", "population"})
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b5dcfd4 and ba71eef.

📒 Files selected for processing (7)
  • docs/advanced_features/structured_outputs.ipynb (3 hunks)
  • python/sglang/srt/constrained/llguidance_backend.py (2 hunks)
  • python/sglang/srt/constrained/utils.py (1 hunks)
  • python/sglang/srt/constrained/xgrammar_backend.py (2 hunks)
  • python/sglang/srt/entrypoints/openai/protocol.py (6 hunks)
  • python/sglang/srt/function_call/function_call_parser.py (4 hunks)
  • test/srt/openai_server/features/test_structural_tag.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
test/srt/openai_server/features/test_structural_tag.py (2)
python/sglang/srt/utils/common.py (1)
  • kill_process_tree (967-1003)
python/sglang/test/test_utils.py (2)
  • CustomTestCase (1611-1619)
  • popen_launch_server (501-642)
python/sglang/srt/constrained/xgrammar_backend.py (1)
python/sglang/srt/constrained/utils.py (1)
  • is_legacy_structural_tag (4-12)
python/sglang/srt/constrained/llguidance_backend.py (1)
python/sglang/srt/constrained/utils.py (1)
  • is_legacy_structural_tag (4-12)
python/sglang/srt/function_call/function_call_parser.py (1)
python/sglang/srt/entrypoints/openai/protocol.py (4)
  • LegacyStructuralTagResponseFormat (133-136)
  • StructuresResponseFormat (126-129)
  • Tool (419-423)
  • ToolChoice (432-436)
🪛 Ruff (0.13.3)
docs/advanced_features/structured_outputs.ipynb

355-355: Probable use of requests call without timeout

(S113)


388-388: Probable use of requests call without timeout

(S113)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (31)
  • GitHub Check: performance-test-1-gpu-part-3
  • GitHub Check: accuracy-test-1-gpu
  • GitHub Check: unit-test-frontend
  • GitHub Check: unit-test-backend-2-gpu (1)
  • GitHub Check: performance-test-1-gpu-part-1
  • GitHub Check: performance-test-1-gpu-part-2
  • GitHub Check: unit-test-backend-2-gpu (0)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 11)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 4)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 9)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 1)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 2)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 8)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 10)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 6)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 3)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 0)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 5)
  • GitHub Check: unit-test-backend-1-gpu-amd (linux-mi325-gpu-1, 7)
  • GitHub Check: mla-test-1-gpu-amd (linux-mi325-gpu-1)
  • GitHub Check: bench-test-2-gpu-amd (linux-mi325-gpu-2)
  • GitHub Check: unit-test-backend-2-gpu-amd (linux-mi325-gpu-2)
  • GitHub Check: unit-test-sgl-kernel-amd (linux-mi325-gpu-1)
  • GitHub Check: performance-test-1-gpu-part-2-amd (linux-mi325-gpu-1)
  • GitHub Check: performance-test-1-gpu-part-1-amd (linux-mi325-gpu-1)
  • GitHub Check: accuracy-test-2-gpu-amd (linux-mi325-gpu-2)
  • GitHub Check: accuracy-test-1-gpu-amd (linux-mi325-gpu-1)
  • GitHub Check: run-all-notebooks
  • GitHub Check: vllm-dependency-test
  • GitHub Check: build-test (all)
  • GitHub Check: lint
🔇 Additional comments (9)
docs/advanced_features/structured_outputs.ipynb (2)

352-394: Latest structural_tag example looks correct

Uses begin/end and triggered_tags per XGrammar v0.1.25.

Ensure your runtime has xgrammar >= 0.1.25 (begin field). Based on learnings


922-971: LGTM: SRT latest structural_tag example

API shape matches triggered_tags format and mirrors the OpenAI path.

python/sglang/srt/function_call/function_call_parser.py (1)

126-160: LGTM: Legacy structural_tag construction

Type hints and return path align with LegacyStructuralTagResponseFormat and ToolCallConstraint.

python/sglang/srt/entrypoints/openai/protocol.py (2)

596-597: to_sampling_params signature change LGTM

The ToolCallConstraint type integration is consistent across callers.


1157-1158: Updated MessageProcessingResult type LGTM

tool_call_constraint now typed precisely.

test/srt/openai_server/features/test_structural_tag.py (4)

5-18: LGTM!

All imports are appropriate and necessary for the test implementation.


21-37: LGTM!

The setup helper correctly configures and launches the test server with the specified grammar backend.


40-51: LGTM!

The test class setup follows proper unittest patterns with appropriate resource management. The use of Any type for the process attribute is acceptable given the subprocess.Popen return type complexity.


53-80: LGTM!

The test effectively validates const_string constraint enforcement. Using an intentionally incorrect answer is a good design choice to verify that the structural_tag constraint is respected regardless of semantic correctness.

@CatherineSue
Copy link
Collaborator

Will approve after all CI passes

@hnyls2002 hnyls2002 merged commit 276e7b3 into sgl-project:main Oct 20, 2025
92 of 96 checks passed
@airMeng
Copy link
Collaborator

airMeng commented Oct 20, 2025

@hnyls2002
Copy link
Collaborator

@airMeng That is because the lint rules on main have been updated over the last two days. Thanks.

@hnyls2002 hnyls2002 mentioned this pull request Oct 20, 2025
@DarkSharpness DarkSharpness deleted the stag_v2 branch October 20, 2025 15:23
@Ubospica
Copy link
Collaborator

Thank you so much @DarkSharpness @CatherineSue @hnyls2002!

xjpang pushed a commit to xjpang/sglang that referenced this pull request Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants