Skip to content

feat(llm): add native groq provider support and fix cache_breakpoint …#6287

Open
Mahajan-Sachin wants to merge 5 commits into
crewAIInc:mainfrom
Mahajan-Sachin:feat/native-groq-support
Open

feat(llm): add native groq provider support and fix cache_breakpoint …#6287
Mahajan-Sachin wants to merge 5 commits into
crewAIInc:mainfrom
Mahajan-Sachin:feat/native-groq-support

Conversation

@Mahajan-Sachin

@Mahajan-Sachin Mahajan-Sachin commented Jun 22, 2026

Copy link
Copy Markdown

Description

This PR implements native Groq LLM provider support in CrewAI and fixes the cache_breakpoint issue when using non-Anthropic providers.

  1. Native Groq Support:
    • Added "groq" configuration to OPENAI_COMPATIBLE_PROVIDERS pointing to https://api.groq.com/openai/v1.
    • Updated LLM class routing (SUPPORTED_NATIVE_PROVIDERS, provider_mapping, and _get_native_provider) to route Groq models (llama, gemma, mixtral, whisper) natively using the OpenAICompatibleCompletion provider.
  2. Cache Breakpoint Fix:
    • Stripped the Anthropic-specific cache_breakpoint key from messages for all non-Anthropic providers in _format_messages_for_provider to prevent API errors (e.g., BadRequestError: 400).

Related Issues

Closes #6286
Closes #5886

Verification

1. Automated Tests

Unit tests added to lib/crewai/tests/test_llm.py verifying native routing and fallback behaviors. Both tests passed successfully:

download

2. Manual Verification

Successfully ran a crew kickoff using groq/llama-3.3-70b-versatile under native SDK configuration, routing successfully without falling back to LiteLLM:

download

And the LLM generated the final answer correctly:
download

llm-generated

Summary by CodeRabbit

New Features

  • Added Groq as a natively supported LLM provider for native routing and provider inference.
  • Recognizes common Groq-compatible model prefixes and routes groq/... models to the Groq provider.
  • Integrated Groq OpenAI-compatible endpoint settings, including required API key and optional base URL override.

Bug Fixes

  • Improved message preprocessing by stripping cache breakpoint markers for non-Anthropic providers.

Tests

  • Added Groq coverage for provider configuration and LLM(...) behavior, plus assertions for cache breakpoint handling.

@corridor-security corridor-security Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Summary: This PR adds native Groq LLM provider routing and strips Anthropic-specific cache metadata from messages sent to non-Anthropic providers. No exploitable security vulnerabilities were identified.

Risk: Low risk. The changes use an environment-sourced API key and HTTPS default endpoint consistent with existing OpenAI-compatible provider handling, without modifying authentication, authorization, public endpoints, or sensitive data storage.

@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 85e607d5-0731-4aca-85fa-bc5adb765ed4

📥 Commits

Reviewing files that changed from the base of the PR and between 7b8adc8 and ad5e235.

📒 Files selected for processing (3)
  • lib/crewai/src/crewai/llm.py
  • lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py
  • lib/crewai/tests/test_llm.py
💤 Files with no reviewable changes (1)
  • lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • lib/crewai/src/crewai/llm.py

📝 Walkthrough

Walkthrough

Adds Groq as a native OpenAI-compatible provider by registering it in the native provider allowlist, mapping groq/-prefixed models to the canonical groq provider, extending pattern matching for Groq model name prefixes, and adding a ProviderConfig entry to OPENAI_COMPATIBLE_PROVIDERS. Also fixes a bug where CACHE_BREAKPOINT_KEY was forwarded in message dicts to non-Anthropic APIs.

Changes

Groq Native Provider and Cache Breakpoint Fix

Layer / File(s) Summary
Groq native provider routing and registry
lib/crewai/src/crewai/llm.py, lib/crewai/src/crewai/llms/providers/openai_compatible/completion.py, lib/crewai/tests/test_llm.py, lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py
Registers groq in the native provider allowlist, maps groq/-prefixed models to the canonical provider, extends pattern matching to recognize Groq-compatible model name prefixes, routes groq through the OpenAI-compatible completion path, and adds a ProviderConfig entry with base_url, GROQ_API_KEY, and GROQ_BASE_URL env vars. Tests verify Groq native SDK selection when GROQ_API_KEY is set, update the non-native provider fallback test case from Groq to Replicate, assert the Groq provider registry configuration, and validate that LLM with a groq/... model creates an OpenAICompatibleCompletion.
Strip CACHE_BREAKPOINT_KEY for non-Anthropic providers
lib/crewai/src/crewai/llm.py
_format_messages_for_provider now creates a cleaned copy of each outgoing message dict with CACHE_BREAKPOINT_KEY removed when the target provider is not Anthropic, preventing unsupported-property errors from Groq and other OpenAI-compatible APIs. Tests verify that the key is stripped for non-Anthropic models and preserved for Anthropic.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: adding native Groq provider support and fixing the cache_breakpoint issue for non-Anthropic providers.
Linked Issues check ✅ Passed The PR successfully implements all coding requirements from linked issues #6286 and #5886: adds Groq to SUPPORTED_NATIVE_PROVIDERS, maps it as OpenAI-compatible, and strips cache_breakpoint for non-Anthropic providers with comprehensive test coverage.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the stated objectives: Groq provider configuration, native routing setup, cache_breakpoint stripping logic, and corresponding unit tests. No unrelated modifications detected.
Docstring Coverage ✅ Passed Docstring coverage is 93.75% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with 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.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
lib/crewai/src/crewai/llm.py (1)

558-563: 🧹 Nitpick | 🔵 Trivial

Groq model prefix patterns are unnecessarily broad and include unpopulated model types.

The patterns ["llama", "gemma", "mixtral", "whisper"] will match any model starting with these strings. The constants show only llama and gemma models currently; mixtral and whisper patterns have no corresponding models. Patterns like groq/llamacpp-custom or groq/gemma-unofficial would pass this check but be rejected by the Groq API.

While the API will ultimately reject invalid models, the inclusion of unmatched prefixes suggests the patterns should either be removed if not needed or clarified if they anticipate future Groq models.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@lib/crewai/src/crewai/llm.py` around lines 558 - 563, The groq provider model
prefix check in the condition where provider == "groq" includes patterns for
"mixtral" and "whisper" that do not correspond to any actual models in the Groq
constants. Update the prefix list by removing "mixtral" and "whisper" from the
array, keeping only the prefixes "llama" and "gemma" that have actual
corresponding models. This will prevent the check from incorrectly accepting
invalid model names that would ultimately be rejected by the Groq API.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@lib/crewai/src/crewai/llms/providers/openai_compatible/completion.py`:
- Around line 46-51: Add a new test method called test_groq_config to the test
file that verifies the Groq provider configuration is correctly registered with
the expected values. The test should validate that the Groq entry has base_url
set to "https://api.groq.com/openai/v1", api_key_env set to "GROQ_API_KEY",
base_url_env set to "GROQ_BASE_URL", and api_key_required flag set to True.
Follow the same pattern and structure used in the existing test methods for
other OpenAI-compatible providers such as test_openrouter_config,
test_deepseek_config, and test_ollama_config to ensure consistency.

---

Nitpick comments:
In `@lib/crewai/src/crewai/llm.py`:
- Around line 558-563: The groq provider model prefix check in the condition
where provider == "groq" includes patterns for "mixtral" and "whisper" that do
not correspond to any actual models in the Groq constants. Update the prefix
list by removing "mixtral" and "whisper" from the array, keeping only the
prefixes "llama" and "gemma" that have actual corresponding models. This will
prevent the check from incorrectly accepting invalid model names that would
ultimately be rejected by the Groq API.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a272e948-080b-496f-bac7-2c19c2a247b9

📥 Commits

Reviewing files that changed from the base of the PR and between 4cbfbdb and b9bde56.

📒 Files selected for processing (3)
  • lib/crewai/src/crewai/llm.py
  • lib/crewai/src/crewai/llms/providers/openai_compatible/completion.py
  • lib/crewai/tests/test_llm.py

@Mahajan-Sachin

Copy link
Copy Markdown
Author

@coderabbitai Removed mixtral from the Groq prefix list since it has been deprecated by Groq. However, whisper is kept in the list as Groq still actively supports speech-to-text models like whisper-large-v3.

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@Mahajan-Sachin That's a sensible cleanup — keeping deprecated model prefixes in the routing table could silently misdirect requests. The updated Groq prefix set (llama, gemma, whisper) now accurately reflects the models Groq actively supports, and retaining whisper for the whisper-large-v3 speech-to-text use case is the right call.


✏️ Learnings added
Learnt from: Mahajan-Sachin
URL: https://github.com/crewAIInc/crewAI/pull/6287

Timestamp: 2026-06-23T05:22:29.138Z
Learning: In the CrewAI codebase (`lib/crewai/src/crewai/llm.py`), the Groq native provider model prefix list used for routing inference should NOT include `mixtral`, as Groq has deprecated it. The current valid Groq model prefixes are: `llama`, `gemma`, and `whisper` (e.g., `whisper-large-v3` for speech-to-text). This applies to the `_get_native_provider` / provider pattern matching logic added in PR `#6287`.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@Mahajan-Sachin

Copy link
Copy Markdown
Author

@coderabbitai Please review the latest changes on this PR. Does everything look good now? Is there anything else I need to update or change?

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== llm.py relevant sections ==="
cat lib/crewai/src/crewai/llm.py | grep -n "groq\|GROQ\|cache_breakpoint\|CACHE_BREAKPOINT\|SUPPORTED_NATIVE\|native_provider\|_get_native_provider\|OPENAI_COMPATIBLE\|provider_mapping\|mixtral\|whisper\|gemma\|llama" | head -80

echo ""
echo "=== _format_messages_for_provider method ==="
grep -n "_format_messages_for_provider" lib/crewai/src/crewai/llm.py

Length of output: 3803


🏁 Script executed:

#!/bin/bash
echo "=== Full _format_messages_for_provider ==="
grep -n -A 40 "def _format_messages_for_provider" lib/crewai/src/crewai/llm.py

echo ""
echo "=== _get_native_provider ==="
grep -n -A 30 "def _get_native_provider\|_infer_provider\|native_provider" lib/crewai/src/crewai/llm.py | head -100

echo ""
echo "=== SUPPORTED_NATIVE_PROVIDERS ==="
grep -n -A 20 "SUPPORTED_NATIVE_PROVIDERS" lib/crewai/src/crewai/llm.py | head -40

echo ""
echo "=== provider_mapping ==="
grep -n -A 20 "provider_mapping" lib/crewai/src/crewai/llm.py | head -40

Length of output: 9685


🏁 Script executed:

#!/bin/bash
echo "=== openai_compatible/completion.py ==="
cat lib/crewai/src/crewai/llms/providers/openai_compatible/completion.py | head -80

echo ""
echo "=== test_llm.py groq sections ==="
grep -n -B 3 -A 10 "groq\|replicate\|is_litellm" lib/crewai/tests/test_llm.py | head -120

echo ""
echo "=== test_openai_compatible.py ==="
grep -n -B 2 -A 15 "groq\|Groq\|TestProviderRegistry\|TestLLMIntegration" lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py | head -100

Length of output: 11414


🏁 Script executed:

#!/bin/bash
echo "=== Full diff on PR ==="
gh pr diff 6287 --repo crewAIInc/crewAI 2>/dev/null | head -400

Length of output: 6428



@Mahajan-Sachin The PR images show a passing test run ("6 passed in 14.7s"), a successful Groq crew kickoff via OpenAICompatibleCompletion (no LiteLLM fallback), and a correct final research answer from the Groq-routed agent — all looking solid.

After reviewing the full diff, the implementation is well-structured and correct. Here's a complete breakdown:


✅ What's correct

Area Status
"groq" in SUPPORTED_NATIVE_PROVIDERS
"groq": "groq" in provider_mapping
_matches_provider_pattern with ["llama", "gemma", "whisper"] (mixtral removed)
"groq" in _get_native_provider's openai_compatible_providers set
OPENAI_COMPATIBLE_PROVIDERS["groq"] with correct base URL, env vars, api_key_required
cache_breakpoint stripped for all non-Anthropic providers
replicate/ correctly replacing groq/ in the non-native LiteLLM fallback test
GROQ_BASE_URL env var for endpoint override

🔎 Minor items worth addressing

1. Deferred import inside _format_messages_for_provider

from crewai.llms.cache import CACHE_BREAKPOINT_KEY is imported inside the method body (Line 2298). Python caches module imports so there's no correctness issue, but idiomatic style places it at the top of the file with other imports:

# At the top of llm.py with other imports
from crewai.llms.cache import CACHE_BREAKPOINT_KEY

2. Missing unit test for cache_breakpoint stripping

The stripping logic is new but has no dedicated test. Consider adding one alongside existing message formatting tests:

def test_format_messages_strips_cache_breakpoint_for_non_anthropic():
    """cache_breakpoint keys must be removed for non-Anthropic providers."""
    from crewai.llms.cache import CACHE_BREAKPOINT_KEY

    llm = LLM(model="groq/llama-3.3-70b-versatile", is_litellm=False)
    # Simulate a message that carries the cache breakpoint marker
    messages = [
        {"role": "user", "content": "Hello", CACHE_BREAKPOINT_KEY: True},
    ]
    with patch.dict(os.environ, {"GROQ_API_KEY": "test-key"}):
        formatted = llm._format_messages_for_provider(messages)
    assert all(CACHE_BREAKPOINT_KEY not in msg for msg in formatted)


def test_format_messages_preserves_cache_breakpoint_for_anthropic():
    """cache_breakpoint keys must be preserved for Anthropic providers."""
    from crewai.llms.cache import CACHE_BREAKPOINT_KEY

    with patch.dict(os.environ, {"ANTHROPIC_API_KEY": "test-key"}):
        llm = LLM(model="anthropic/claude-3-5-sonnet-20241022")
    messages = [
        {"role": "user", "content": "Hello", CACHE_BREAKPOINT_KEY: True},
    ]
    formatted = llm._format_messages_for_provider(messages)
    assert any(CACHE_BREAKPOINT_KEY in msg for msg in formatted)

3. Extra blank lines in test_openai_compatible.py

There are two consecutive blank lines after test_groq_config and before test_llm_with_explicit_provider. PEP 8 recommends a single blank line between methods in a class.


Summary

The core implementation is complete and all the routing wires are consistent. The two substantive suggestions are the deferred import cleanup and the cache_breakpoint stripping test — the latter in particular would close the coverage gap for the fix that resolves #5886. Everything else is style-level.

@Mahajan-Sachin

Copy link
Copy Markdown
Author

@coderabbitai All requested changes (clean up of deferred imports, addition of formatting tests, and cleaning up whitespace in test_openai_compatible.py) have been successfully pushed in commit ad5e235. Please do a final review check to ensure everything is perfect!

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== Check CACHE_BREAKPOINT_KEY import at top of llm.py ==="
head -60 lib/crewai/src/crewai/llm.py | grep -n "CACHE_BREAKPOINT\|cache_breakpoint\|from crewai.llms.cache"

echo ""
echo "=== Check no deferred import inside _format_messages_for_provider ==="
grep -n -A 50 "def _format_messages_for_provider" lib/crewai/src/crewai/llm.py | head -60

echo ""
echo "=== Check new cache_breakpoint tests in test_llm.py ==="
grep -n -B 2 -A 20 "cache_breakpoint\|CACHE_BREAKPOINT" lib/crewai/tests/test_llm.py

echo ""
echo "=== Check whitespace in test_openai_compatible.py (blank lines between methods) ==="
grep -n "def test_\|^$\|^    $" lib/crewai/tests/llms/openai_compatible/test_openai_compatible.py | head -60

Length of output: 7024



@Mahajan-Sachin All three changes from commit ad5e235 have been verified — the PR looks perfect. Here's the final check summary:

Item Status Detail
CACHE_BREAKPOINT_KEY moved to top-level import Line 48 of llm.py: from crewai.llms.cache import CACHE_BREAKPOINT_KEY — no longer deferred inside the method body
cache_breakpoint stripping tests added test_format_messages_strips_cache_breakpoint_for_non_anthropic (Line 809) and test_format_messages_preserves_cache_breakpoint_for_anthropic (Line 822) — both test the correct providers and assertions
Whitespace cleanup in test_openai_compatible.py The double blank lines at lines 105–106 are between class boundaries (not between methods), which is correct per PEP 8's two-blank-line rule for top-level/class-level definitions

Everything is clean and consistent. The PR is ready to merge. 🎉


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

@Mahajan-Sachin

Copy link
Copy Markdown
Author

@coderabbitai Will you assign maintainers / trigger review workflows automatically, or should I write a comment to notify the maintainers?

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check for CODEOWNERS file
echo "=== CODEOWNERS ==="
fd -i "CODEOWNERS" --exec cat {} 2>/dev/null || echo "No CODEOWNERS found"

# Check for auto-assign or reviewer assignment GitHub Actions workflows
echo ""
echo "=== Auto-assign or reviewer workflows ==="
fd -e yml -e yaml . .github/workflows --exec grep -l "assign\|reviewer\|review-request" {} 2>/dev/null || echo "No auto-assign workflows found"

# Check current PR reviewers and assignees
echo ""
echo "=== Current PR reviewers/assignees ==="
gh pr view 6287 --repo crewAIInc/crewAI --json reviewRequests,assignees,author | jq .

Length of output: 1042



@Mahajan-Sachin I don't assign maintainers or trigger review workflows — my role is limited to automated code review. Based on the check I just ran, the repository has no CODEOWNERS file and no auto-assign workflow, and the PR currently has no reviewers or assignees set.

Here's what you can do to get maintainer attention:

  1. Request reviewers directly — On the PR page, use the "Reviewers" gear icon on the right sidebar to request specific maintainers.

  2. Tag maintainers in a comment — Leave a comment on the PR mentioning the relevant maintainers (e.g., @joaomdmoura or other core contributors you see active in the repo) to notify them.

  3. Check CONTRIBUTING.md — The project may have guidance on how to get a PR reviewed (e.g., a Discord, a specific process, etc.).

  4. Reference the linked issues — Since this PR resolves #6286 and #5886, you could comment on those issues linking back to the PR to increase visibility.

The PR itself is in great shape, so it's purely a matter of getting the right eyes on it. 👍

@Mahajan-Sachin

Copy link
Copy Markdown
Author

@coderabbitai Can you look at the commit history and identify other active maintainers or core contributors who frequently work on LLM integrations or core codebase components in this repo?

@coderabbitai

coderabbitai Bot commented Jun 23, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
echo "=== Top contributors overall (last 6 months) ==="
gh api "repos/crewAIInc/crewAI/commits?per_page=100&since=2025-12-01" \
  --jq '.[].commit.author.name' | sort | uniq -c | sort -rn | head -20

echo ""
echo "=== Recent PR authors merged into main (LLM/provider related) ==="
gh pr list --repo crewAIInc/crewAI --state merged --limit 50 \
  --json number,title,author,mergedAt \
  --jq '.[] | select(.title | test("llm|provider|groq|anthropic|openai|litellm|model|cache"; "i")) | "\(.mergedAt[:10]) @\(.author.login): #\(.number) \(.title)"'

echo ""
echo "=== Recent commits to lib/crewai/src/crewai/llm.py ==="
gh api "repos/crewAIInc/crewAI/commits?path=src/crewai/llm.py&per_page=30" \
  --jq '.[] | "\(.commit.author.date[:10]) \(.author.login // .commit.author.name): \(.commit.message | split("\n")[0])"' 2>/dev/null | head -30

echo ""
echo "=== Repo contributors ==="
gh api "repos/crewAIInc/crewAI/contributors?per_page=20" \
  --jq '.[] | "\(.contributions) commits: @\(.login)"'

Length of output: 4720



@Mahajan-Sachin Here's what the commit history and contributor data show for the most relevant people to notify:


🔑 Core maintainers most active on LLM integrations

GitHub Handle Total Commits Recent Activity (last 6 months) LLM-relevant work
@joaomdmoura 594 13 commits Founder/lead maintainer; directly authored ad-hoc tool calling via LLM class, context window fixes
@greysonlalonde 522 24 commits ⬆️ Most active recently; merged LiteLLM dep fix (#6203), LLM checkpoint restore fix (#6117), typing/utilities consolidation
@lucasgomide 147 8 commits Most llm.py commits — token usage aggregation (#6122), drop-unsupported-stop-params, Ollama message formatting, tool call logging
@lorenzejay 223 15 commits LLM event handling and tracing system (multiple PRs to llm.py)
@bhancockio 145 LLM streaming response handling, Mistral provider fixes

💡 Recommended action

Since this PR touches llm.py (provider routing + message formatting), the most targeted reviewers would be:

`@greysonlalonde` `@lucasgomide` `@joaomdmoura`

You can request them directly via the "Reviewers" gear on the PR sidebar, or drop a comment like:

Hey @greysonlalonde @lucasgomide @joaomdmoura — this PR adds native Groq provider support and fixes the cache_breakpoint issue for non-Anthropic providers (resolves #6286 and #5886). Would appreciate a review when you get a chance!

@Mahajan-Sachin

Copy link
Copy Markdown
Author

Hey @greysonlalonde @lucasgomide @joaomdmoura — this PR adds native Groq provider support and fixes the cache_breakpoint issue for non-Anthropic providers (resolves #6286 and #5886). All local unit tests are passing and CodeRabbit has approved the changes.

Would appreciate a review when you get a chance! thank you! 😊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant