Fix swallowing client errors bug#841
Conversation
WalkthroughException handling was changed to propagate errors (raise RuntimeError) in three agent register modules; console front-end now explicitly sets Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User
participant FrontEnd as Console Front-End
participant Agent as Agent Register (_response_fn)
participant Provider as OpenAI API Path
User->>FrontEnd: Submit query
FrontEnd->>Agent: Invoke _response_fn()
Agent->>Provider: Make API call
Provider-->>Agent: Error/Exception
note over Agent: New behavior: raise RuntimeError
Agent-->>FrontEnd: Exception propagates
FrontEnd-->>User: Error surfaced by caller
sequenceDiagram
autonumber
participant Caller as Upstream Caller
participant Agent as Agent Register (_response_fn)
rect rgba(200,230,255,0.3)
note over Agent: Old flow (before)
Caller->>Agent: Call _response_fn()
Agent--x Caller: Return ChatResponse or error string
end
rect rgba(200,255,200,0.3)
note over Agent: New flow (after)
Caller->>Agent: Call _response_fn()
Agent-->>Caller: Raise RuntimeError (exception propagation)
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20–30 minutes Suggested labels
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai review |
|
@zhongxuanwang-nv I'll review the changes in this PR that fixes the client error swallowing bug. 🧠 Learnings used✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (8)
src/nat/cli/commands/start.py (1)
225-236: Add explicit return type on nested coroutineMinor typing polish for inner coroutine.
Suggested change (outside the selected range; illustrative):
async def run_plugin() -> int | None: ...src/nat/front_ends/console/console_front_end_plugin.py (1)
83-85: LGTM — explicit return_exceptions=FalseChange is clear and aligns with the new error-propagation strategy.
Optional: consider cancelling sibling tasks on first failure (TaskGroup in py3.11) to avoid wasted work if one query fails.
src/nat/agent/tool_calling_agent/register.py (1)
116-119: Re-raise pattern: avoid duplicate stacktraces and preserve original tracebackSince you re-raise, log without traceback and keep the original exception to preserve its stack.
Option A (preferred: keep original type and traceback):
- except Exception as ex: - logger.exception("%s Tool Calling Agent failed with exception: %s", AGENT_LOG_PREFIX, ex) - raise RuntimeError from ex + except Exception: + logger.error("%s Tool Calling Agent failed with exception", AGENT_LOG_PREFIX) + raiseOption B (if keeping RuntimeError is required for API uniformity, still avoid duplicate stack):
- except Exception as ex: - logger.exception("%s Tool Calling Agent failed with exception: %s", AGENT_LOG_PREFIX, ex) - raise RuntimeError from ex + except Exception as ex: + logger.error("%s Tool Calling Agent failed with exception", AGENT_LOG_PREFIX) + raise RuntimeError from exAdditionally, the docstring still mentions returning an “error message”; update it to reflect raising on failure.
src/nat/builder/function.py (1)
162-167: Good: no duplicate trace; consider silencing TRY400Pattern matches the guidelines (log error, then re-raise). Ruff may flag TRY400; consider an inline ignore to document intent.
Apply this minimal tweak:
- logger.error("Error with ainvoke in function with input: \"%s\" %s", value, err_msg) + logger.error("Error with ainvoke in function with input: \"%s\" %s", value, err_msg) # noqa: TRY400src/nat/runtime/runner.py (2)
152-156: Consistent “empty message” formatting — keep; silence TRY400Matches the new formatting approach and re-raises correctly. Add a noqa to avoid Ruff noise.
- logger.error("Error running workflow%s", err_msg) + logger.error("Error running workflow%s", err_msg) # noqa: TRY400
187-189: Normalize error logging format in result_stream()Mirror the empty-message handling used in result() for consistency.
- except Exception as e: - logger.error("Error running workflow: %s", e) + except Exception as e: + err_msg = "" if str(e).strip() == "" else f": {e}" + logger.error("Error running workflow%s", err_msg) # noqa: TRY400src/nat/agent/react_agent/register.py (1)
154-157: Re-raise pattern: log without traceback and preserve original exceptionAlign with the error-handling guideline to avoid duplicated stacks and keep the original traceback.
Option A (preferred):
- except Exception as ex: - logger.exception("%s ReAct Agent failed with exception: %s", AGENT_LOG_PREFIX, ex) - raise RuntimeError from ex + except Exception: + logger.error("%s ReAct Agent failed with exception", AGENT_LOG_PREFIX) + raiseOption B (if RuntimeError is required, still avoid duplicate trace):
- except Exception as ex: - logger.exception("%s ReAct Agent failed with exception: %s", AGENT_LOG_PREFIX, ex) - raise RuntimeError from ex + except Exception as ex: + logger.error("%s ReAct Agent failed with exception", AGENT_LOG_PREFIX) + raise RuntimeError from exAlso update the function docstring to remove “or error message” in the return description and add a Raises section.
src/nat/agent/rewoo_agent/register.py (1)
159-162: Re-raise pattern consistencySame recommendation as other agents to avoid duplicate stacktraces and preserve traceback.
Option A (preferred):
- except Exception as ex: - logger.exception("ReWOO Agent failed with exception: %s", ex) - raise RuntimeError from ex + except Exception: + logger.error("ReWOO Agent failed with exception") + raiseOption B (keep RuntimeError, avoid duplicate stack):
- except Exception as ex: - logger.exception("ReWOO Agent failed with exception: %s", ex) - raise RuntimeError from ex + except Exception as ex: + logger.error("ReWOO Agent failed with exception") + raise RuntimeError from exPlease also update the docstring to reflect raising on errors rather than returning error messages.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
src/nat/agent/react_agent/register.py(1 hunks)src/nat/agent/rewoo_agent/register.py(1 hunks)src/nat/agent/tool_calling_agent/register.py(1 hunks)src/nat/builder/function.py(1 hunks)src/nat/cli/commands/start.py(1 hunks)src/nat/front_ends/console/console_front_end_plugin.py(1 hunks)src/nat/runtime/runner.py(1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*
⚙️ CodeRabbit configuration file
**/*: # Code Review Instructions
- Ensure the code follows best practices and coding standards. - For Python code, follow
PEP 20 and
PEP 8 for style guidelines.- Check for security vulnerabilities and potential issues. - Python methods should use type hints for all parameters and return values.
Example:def my_function(param1: int, param2: str) -> bool: pass- For Python exception handling, ensure proper stack trace preservation:
- When re-raising exceptions: use bare
raisestatements to maintain the original stack trace,
and uselogger.error()(notlogger.exception()) to avoid duplicate stack trace output.- When catching and logging exceptions without re-raising: always use
logger.exception()
to capture the full stack trace information.Documentation Review Instructions - Verify that documentation and comments are clear and comprehensive. - Verify that the documentation doesn't contain any TODOs, FIXMEs or placeholder text like "lorem ipsum". - Verify that the documentation doesn't contain any offensive or outdated terms. - Verify that documentation and comments are free of spelling mistakes, ensure the documentation doesn't contain any
words listed in the
ci/vale/styles/config/vocabularies/nat/reject.txtfile, words that might appear to be
spelling mistakes but are listed in theci/vale/styles/config/vocabularies/nat/accept.txtfile are OK.Misc. - All code (except .mdc files that contain Cursor rules) should be licensed under the Apache License 2.0,
and should contain an Apache License 2.0 header comment at the top of each file.
- Confirm that copyright years are up-to date whenever a file is changed.
Files:
src/nat/front_ends/console/console_front_end_plugin.pysrc/nat/builder/function.pysrc/nat/cli/commands/start.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/react_agent/register.pysrc/nat/runtime/runner.pysrc/nat/agent/tool_calling_agent/register.py
src/nat/**/*
⚙️ CodeRabbit configuration file
This directory contains the core functionality of the toolkit. Changes should prioritize backward compatibility.
Files:
src/nat/front_ends/console/console_front_end_plugin.pysrc/nat/builder/function.pysrc/nat/cli/commands/start.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/react_agent/register.pysrc/nat/runtime/runner.pysrc/nat/agent/tool_calling_agent/register.py
🪛 Ruff (0.13.1)
src/nat/builder/function.py
166-166: Use logging.exception instead of logging.error
Replace with exception
(TRY400)
src/nat/cli/commands/start.py
238-238: Do not catch blind exception: Exception
(BLE001)
239-239: Use logging.exception instead of logging.error
Replace with exception
(TRY400)
240-240: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
(B904)
src/nat/runtime/runner.py
156-156: Use logging.exception instead of logging.error
Replace with exception
(TRY400)
There was a problem hiding this comment.
Actionable comments posted: 3
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
src/nat/agent/react_agent/register.py(1 hunks)src/nat/agent/rewoo_agent/register.py(1 hunks)src/nat/agent/tool_calling_agent/register.py(1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{py,yaml,yml}
📄 CodeRabbit inference engine (.cursor/rules/nat-test-llm.mdc)
**/*.{py,yaml,yml}: Configure response_seq as a list of strings; values cycle per call, and [] yields an empty string.
Configure delay_ms to inject per-call artificial latency in milliseconds for nat_test_llm.
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
**/*.py
📄 CodeRabbit inference engine (.cursor/rules/nat-test-llm.mdc)
**/*.py: Programmatic use: create TestLLMConfig(response_seq=[...], delay_ms=...), add with builder.add_llm("", cfg).
When retrieving the test LLM wrapper, use builder.get_llm(name, wrapper_type=LLMFrameworkEnum.) and call the framework’s method (e.g., ainvoke, achat, call).
**/*.py: In code comments/identifiers use NAT abbreviations as specified: nat for API namespace/CLI, nvidia-nat for package name, NAT for env var prefixes; do not use these abbreviations in documentation
Follow PEP 20 and PEP 8; run yapf with column_limit=120; use 4-space indentation; end files with a single trailing newline
Run ruff check --fix as linter (not formatter) using pyproject.toml config; fix warnings unless explicitly ignored
Respect naming: snake_case for functions/variables, PascalCase for classes, UPPER_CASE for constants
Treat pyright warnings as errors during development
Exception handling: use bare raise to re-raise; log with logger.error() when re-raising to avoid duplicate stack traces; use logger.exception() when catching without re-raising
Provide Google-style docstrings for every public module, class, function, and CLI command; first line concise and ending with a period; surround code entities with backticks
Validate and sanitize all user input, especially in web or CLI interfaces
Prefer httpx with SSL verification enabled by default and follow OWASP Top-10 recommendations
Use async/await for I/O-bound work; profile CPU-heavy paths with cProfile or mprof before optimizing; cache expensive computations with functools.lru_cache or external cache; leverage NumPy vectorized operations when beneficial
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
src/**/*.py
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
All importable Python code must live under src/ (or packages//src/)
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
src/nat/**/*
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
Changes in src/nat should prioritize backward compatibility
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
⚙️ CodeRabbit configuration file
This directory contains the core functionality of the toolkit. Changes should prioritize backward compatibility.
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
{src/**/*.py,packages/*/src/**/*.py}
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
All public APIs must have Python 3.11+ type hints on parameters and return values; prefer typing/collections.abc abstractions; use typing.Annotated when useful
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
**/*
⚙️ CodeRabbit configuration file
**/*: # Code Review Instructions
- Ensure the code follows best practices and coding standards. - For Python code, follow
PEP 20 and
PEP 8 for style guidelines.- Check for security vulnerabilities and potential issues. - Python methods should use type hints for all parameters and return values.
Example:def my_function(param1: int, param2: str) -> bool: pass- For Python exception handling, ensure proper stack trace preservation:
- When re-raising exceptions: use bare
raisestatements to maintain the original stack trace,
and uselogger.error()(notlogger.exception()) to avoid duplicate stack trace output.- When catching and logging exceptions without re-raising: always use
logger.exception()
to capture the full stack trace information.Documentation Review Instructions - Verify that documentation and comments are clear and comprehensive. - Verify that the documentation doesn't contain any TODOs, FIXMEs or placeholder text like "lorem ipsum". - Verify that the documentation doesn't contain any offensive or outdated terms. - Verify that documentation and comments are free of spelling mistakes, ensure the documentation doesn't contain any
words listed in the
ci/vale/styles/config/vocabularies/nat/reject.txtfile, words that might appear to be
spelling mistakes but are listed in theci/vale/styles/config/vocabularies/nat/accept.txtfile are OK.Misc. - All code (except .mdc files that contain Cursor rules) should be licensed under the Apache License 2.0,
and should contain an Apache License 2.0 header comment at the top of each file.
- Confirm that copyright years are up-to date whenever a file is changed.
Files:
src/nat/agent/react_agent/register.pysrc/nat/agent/rewoo_agent/register.pysrc/nat/agent/tool_calling_agent/register.py
🪛 Ruff (0.13.1)
src/nat/agent/react_agent/register.py
155-155: Redundant exception object included in logging.exception call
(TRY401)
156-156: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
(B904)
src/nat/agent/rewoo_agent/register.py
161-161: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
(B904)
src/nat/agent/tool_calling_agent/register.py
118-118: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling
(B904)
⏰ 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). (1)
- GitHub Check: CI Pipeline / Check
Signed-off-by: Daniel Wang <daniewang@nvidia.com>
bbbf8d1 to
2e2c64b
Compare
Signed-off-by: Daniel Wang <daniewang@nvidia.com>
|
/merge |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
src/nat/builder/function.py (1)
162-163: Tighten the log formatting when the exception string is empty.When
str(e).strip()is empty we still emit"Error with ainvoke ... %s. "(note the trailing space). Optional, but we can avoid the extra placeholder altogether by branching the log call.Apply this tweak locally:
- err_msg = f"Error: {e}" if str(e).strip() else "" - logger.error("Error with ainvoke in function with input: %s. %s", value, err_msg) + err_msg = f"Error: {e}" if str(e).strip() else None + if err_msg is None: + logger.error("Error with ainvoke in function with input: %s.", value) + else: + logger.error("Error with ainvoke in function with input: %s. %s", value, err_msg)
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/nat/builder/function.py(1 hunks)src/nat/runtime/runner.py(1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{py,yaml,yml}
📄 CodeRabbit inference engine (.cursor/rules/nat-test-llm.mdc)
**/*.{py,yaml,yml}: Configure response_seq as a list of strings; values cycle per call, and [] yields an empty string.
Configure delay_ms to inject per-call artificial latency in milliseconds for nat_test_llm.
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
**/*.py
📄 CodeRabbit inference engine (.cursor/rules/nat-test-llm.mdc)
**/*.py: Programmatic use: create TestLLMConfig(response_seq=[...], delay_ms=...), add with builder.add_llm("", cfg).
When retrieving the test LLM wrapper, use builder.get_llm(name, wrapper_type=LLMFrameworkEnum.) and call the framework’s method (e.g., ainvoke, achat, call).
**/*.py: In code comments/identifiers use NAT abbreviations as specified: nat for API namespace/CLI, nvidia-nat for package name, NAT for env var prefixes; do not use these abbreviations in documentation
Follow PEP 20 and PEP 8; run yapf with column_limit=120; use 4-space indentation; end files with a single trailing newline
Run ruff check --fix as linter (not formatter) using pyproject.toml config; fix warnings unless explicitly ignored
Respect naming: snake_case for functions/variables, PascalCase for classes, UPPER_CASE for constants
Treat pyright warnings as errors during development
Exception handling: use bare raise to re-raise; log with logger.error() when re-raising to avoid duplicate stack traces; use logger.exception() when catching without re-raising
Provide Google-style docstrings for every public module, class, function, and CLI command; first line concise and ending with a period; surround code entities with backticks
Validate and sanitize all user input, especially in web or CLI interfaces
Prefer httpx with SSL verification enabled by default and follow OWASP Top-10 recommendations
Use async/await for I/O-bound work; profile CPU-heavy paths with cProfile or mprof before optimizing; cache expensive computations with functools.lru_cache or external cache; leverage NumPy vectorized operations when beneficial
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
src/**/*.py
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
All importable Python code must live under src/ (or packages//src/)
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
src/nat/**/*
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
Changes in src/nat should prioritize backward compatibility
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
⚙️ CodeRabbit configuration file
This directory contains the core functionality of the toolkit. Changes should prioritize backward compatibility.
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
{src/**/*.py,packages/*/src/**/*.py}
📄 CodeRabbit inference engine (.cursor/rules/general.mdc)
All public APIs must have Python 3.11+ type hints on parameters and return values; prefer typing/collections.abc abstractions; use typing.Annotated when useful
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
**/*
⚙️ CodeRabbit configuration file
**/*: # Code Review Instructions
- Ensure the code follows best practices and coding standards. - For Python code, follow
PEP 20 and
PEP 8 for style guidelines.- Check for security vulnerabilities and potential issues. - Python methods should use type hints for all parameters and return values.
Example:def my_function(param1: int, param2: str) -> bool: pass- For Python exception handling, ensure proper stack trace preservation:
- When re-raising exceptions: use bare
raisestatements to maintain the original stack trace,
and uselogger.error()(notlogger.exception()) to avoid duplicate stack trace output.- When catching and logging exceptions without re-raising: always use
logger.exception()
to capture the full stack trace information.Documentation Review Instructions - Verify that documentation and comments are clear and comprehensive. - Verify that the documentation doesn't contain any TODOs, FIXMEs or placeholder text like "lorem ipsum". - Verify that the documentation doesn't contain any offensive or outdated terms. - Verify that documentation and comments are free of spelling mistakes, ensure the documentation doesn't contain any
words listed in the
ci/vale/styles/config/vocabularies/nat/reject.txtfile, words that might appear to be
spelling mistakes but are listed in theci/vale/styles/config/vocabularies/nat/accept.txtfile are OK.Misc. - All code (except .mdc files that contain Cursor rules) should be licensed under the Apache License 2.0,
and should contain an Apache License 2.0 header comment at the top of each file.
- Confirm that copyright years are up-to date whenever a file is changed.
Files:
src/nat/runtime/runner.pysrc/nat/builder/function.py
🪛 Ruff (0.13.1)
src/nat/runtime/runner.py
153-153: Use logging.exception instead of logging.error
Replace with exception
(TRY400)
src/nat/builder/function.py
163-163: Use logging.exception instead of logging.error
Replace with exception
(TRY400)
🔇 Additional comments (1)
src/nat/runtime/runner.py (1)
152-153: Nice job cleaning up the log output.The conditional suffix keeps the log readable without trailing punctuation, while still surfacing the exception string when present. 👍
* This example appears to have been broken by PR #841 which relies on the original LangGraph recursion exception being raised (or scraping it from the output text) ## By Submitting this PR I confirm: - I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/develop/docs/source/resources/contributing.md). - We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license. - Any contribution which contains commits that are not Signed-Off will not be accepted. - When the PR is ready for review, new or existing tests cover these changes. - When the PR is ready for review, the documentation is up to date with these changes. ## Summary by CodeRabbit - Bug Fixes - Preserve original error types and tracebacks for clearer diagnostics. - Runner now explicitly marks workflows as FAILED before propagating errors. - Standardized error messages improve observability during failures. - Refactor - Unified error logging format and handling across agents and runtime. - Chores - HITL example configuration now relies solely on the NIM LLM; OpenAI option removed. Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Will Killian (https://github.com/willkill07) URL: #970
* This example appears to have been broken by PR NVIDIA#841 which relies on the original LangGraph recursion exception being raised (or scraping it from the output text) ## By Submitting this PR I confirm: - I am familiar with the [Contributing Guidelines](https://github.com/NVIDIA/NeMo-Agent-Toolkit/blob/develop/docs/source/resources/contributing.md). - We require that all contributors "sign-off" on their commits. This certifies that the contribution is your original work, or you have rights to submit it under the same license, or a compatible license. - Any contribution which contains commits that are not Signed-Off will not be accepted. - When the PR is ready for review, new or existing tests cover these changes. - When the PR is ready for review, the documentation is up to date with these changes. ## Summary by CodeRabbit - Bug Fixes - Preserve original error types and tracebacks for clearer diagnostics. - Runner now explicitly marks workflows as FAILED before propagating errors. - Standardized error messages improve observability during failures. - Refactor - Unified error logging format and handling across agents and runtime. - Chores - HITL example configuration now relies solely on the NIM LLM; OpenAI option removed. Authors: - David Gardner (https://github.com/dagardner-nv) Approvers: - Will Killian (https://github.com/willkill07) URL: NVIDIA#970 Signed-off-by: Yuchen Zhang <yuchenz@nvidia.com>
Description
Closes AIQ-1952
Bug description from David:
This PR fixes by explicitly raising the
RuntimeErrorinstead of returning a validChatResponseobject.🤔 Open to discussion
I explicitly didn't set any description for
RuntimeErrorbecause that error has been already output by thelogger.exception, and if I set the description for theRuntimeError, the same error will be re-iterated for 3 times, and since the error is 4-line long, I think just outputting 1 time is enough.Therefore, I also added the logic for removing the trailing
:if the error message is empty.However, one downside of it is we may accidentally omit for important exception messages. But from some shallow research I think most exception details would already be captured in the downstream
logger.exceptionI'm definitely open to discussion here what do you guys think if this would be the best thing to do here!
By Submitting this PR I confirm:
Summary by CodeRabbit
Bug Fixes
Chores