-
Notifications
You must be signed in to change notification settings - Fork 299
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add GROQ support #254
base: main
Are you sure you want to change the base?
Add GROQ support #254
Conversation
@pastetreee is attempting to deploy a commit to the Inbox Zero Team on Vercel. A member of the Team first needs to authorize it. |
|
Warning Rate limit exceeded@0xrushi has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 7 minutes and 57 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. WalkthroughThe pull request introduces several enhancements related to the integration of a new AI provider, GROQ. Key changes include the addition of a new model and provider in configuration files, updates to error handling functions to recognize GROQ-specific errors, and modifications to the Changes
Possibly related PRs
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Outside diff range and nitpick comments (2)
apps/web/app/api/user/settings/route.ts (1)
31-32
: Consider standardizing provider behaviorFor consistency across providers, consider implementing a common pattern for:
- API key validation
- Fallback behavior (like Anthropic's fallback to Bedrock)
- Error handling specific to GROQ
This will make the codebase more maintainable and ensure consistent behavior across providers.
apps/web/utils/error.ts (1)
104-123
: Add JSDoc documentation for the new GROQ error handlers.While the function names are descriptive, adding JSDoc comments would help maintain consistency with best practices and improve maintainability.
Apply this documentation:
+/** + * Checks if the error is due to an invalid GROQ API key + * @param error - The API call error to check + * @returns true if the error is due to invalid API key + */ export function isGroqInvalidApiKeyError(error: APICallError): boolean { +/** + * Checks if the error is due to GROQ rate limiting + * @param error - The API call error to check + * @returns true if the error is due to rate limiting + */ export function isGroqRateLimitError(error: APICallError): boolean { +/** + * Checks if the error is due to exceeded GROQ quota + * @param error - The API call error to check + * @returns true if the error is due to quota exceeded + */ export function isGroqQuotaExceededError(error: APICallError): boolean {
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (5)
apps/web/app/api/user/settings/route.ts
(1 hunks)apps/web/package.json
(1 hunks)apps/web/utils/error.ts
(2 hunks)apps/web/utils/llms/config.ts
(2 hunks)apps/web/utils/llms/index.ts
(2 hunks)
🔇 Additional comments (12)
apps/web/utils/llms/config.ts (5)
4-4
: LGTM: Provider constant addition follows conventions
The GROQ provider addition maintains consistent naming patterns and structure.
12-12
: Verify the model identifier stability
The model identifier llama3-groq-70b-8192-tool-use-preview
contains a preview
suffix, suggesting this might be a beta feature. Please verify:
- Is this the official, stable model identifier from GROQ?
- Are there any plans to update this identifier when it moves out of preview?
Consider adding a comment documenting the context window size (8192) and preview status for future reference.
18-18
: LGTM: Provider option follows established pattern
The Groq provider option is correctly structured and maintains consistency with existing options.
33-38
: LGTM: Model options configuration is well-structured
The GROQ model configuration follows the established pattern and maintains consistency with other provider configurations.
Line range hint 4-38
: Verify GROQ SDK compatibility
Let's ensure the configuration aligns with the GROQ SDK requirements and documentation.
✅ Verification successful
GROQ integration is properly configured and matches SDK requirements
The configuration aligns correctly with the GROQ SDK implementation:
- Uses official
@ai-sdk/groq
package - Properly initializes GROQ client with required API key
- Correctly defines model identifier
llama3-groq-70b-8192-tool-use-preview
- Handles environment variables appropriately with fallback pattern
- Integration follows the same pattern as other providers in the codebase
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for GROQ SDK dependency and version
grep -r "groq" package.json
# Look for any GROQ-related configuration or environment variables
find . -type f -exec grep -l "GROQ" {} \;
Length of output: 205
Script:
#!/bin/bash
# Check GROQ implementation details
rg -A 10 "GROQ" ./apps/web/utils/llms/index.ts
# Check environment variables and configuration
rg "GROQ|groq" ./apps/web/app/api/user/settings/route.ts
# Check if there are any GROQ-specific error handling or types
ast-grep --pattern 'interface $_ {
$$$
groq$_: $_;
$$$
}'
Length of output: 600
Script:
#!/bin/bash
# Check for GROQ client initialization and API usage
rg -A 5 "createGroq" ./apps/web/utils/llms/
# Look for environment variable definitions
rg "GROQ_API_KEY" .
# Check for any GROQ-specific types or interfaces
ast-grep --pattern 'type $_ = {
$$$
groq$_: $_;
$$$
}'
Length of output: 1038
apps/web/app/api/user/settings/route.ts (1)
Line range hint 11-11
: LGTM: Type export provides good type safety
The SaveSettingsResponse
type export helps maintain API contract consistency and provides proper type safety for API consumers.
apps/web/utils/error.ts (1)
104-123
: Ensure test coverage for new GROQ error handlers.
The new error handling functions should be covered by unit tests to verify they correctly identify different error message variations.
Let's check for existing test coverage:
Would you like me to help generate unit tests for these functions?
apps/web/package.json (2)
17-17
: Verify package security and reliability.
As this is a new AI SDK dependency, we should verify its security profile.
Let's check for any security advisories and audit the package:
#!/bin/bash
# Description: Check for security advisories and audit the package
# Expected: No critical security issues
echo "Checking for security advisories..."
npm audit @ai-sdk/groq
echo "Checking package quality..."
npm view @ai-sdk/groq repository.url
17-17
: Consider pinning to a more stable version.
The GROQ SDK is at a very early version (0.0.3) compared to other AI SDKs in use. This might introduce stability issues.
Let's verify the package's latest version and release history:
apps/web/utils/llms/index.ts (3)
11-11
: LGTM! Import statement follows existing patterns.
The GROQ SDK import is correctly placed alongside other provider imports and follows the established naming convention.
69-76
: Verify GROQ compatibility with all completion types.
The GROQ provider is integrated with the common model interface, but we should verify its compatibility with all completion types (object, stream, and tools).
Let's check the GROQ SDK capabilities:
Also applies to: 82-238
69-76
: 🛠️ Refactor suggestion
Consider adding GROQ-specific error handling.
The handleError
function includes specific error handling for OpenAI and Anthropic providers. Consider adding GROQ-specific error handling to maintain consistency and improve error reporting.
Let's check if there are any GROQ-specific errors we should handle:
Also applies to: 191-238
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Outside diff range and nitpick comments (1)
apps/web/utils/llms/index.ts (1)
GROQ error handling is already implemented but not used
The review comment is valid but incomplete. The codebase already has GROQ-specific error handling functions (
isGroqInvalidApiKeyError
,isGroqRateLimitError
,isGroqQuotaExceededError
) defined inapps/web/utils/error.ts
, and they are properly integrated intoisKnownApiError
. However, these aren't being used in thehandleError
function.Add the following error handling cases:
- Add GROQ error handling in
handleError
:if (isGroqInvalidApiKeyError(error)) { return await addUserErrorMessage( userEmail, ErrorType.GROQ_INVALID_API_KEY, error.message ); } if (isGroqRateLimitError(error)) { return await addUserErrorMessage( userEmail, ErrorType.GROQ_RATE_LIMIT, error.message ); } if (isGroqQuotaExceededError(error)) { return await addUserErrorMessage( userEmail, ErrorType.GROQ_QUOTA_EXCEEDED, error.message ); }🔗 Analysis chain
Line range hint
192-236
: Add GROQ-specific error handling.The
handleError
function includes specific error handling for OpenAI and Anthropic, but not for GROQ. Consider adding GROQ-specific error handling to maintain consistency.Let's check if GROQ SDK exports any error types:
Consider adding GROQ error handling:
// Add to imports import { isGroqError } from "@ai-sdk/groq"; // Add to handleError function if (isGroqError(error)) { return await addUserErrorMessage( userEmail, ErrorType.GROQ_API_ERROR, error.message ); }Note: Update the error types accordingly in your error handling utilities.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Search for error-related exports in GROQ SDK rg -l "export.*Error" node_modules/@ai-sdk/groq/Length of output: 117
Script:
#!/bin/bash # Let's first check if GROQ is actually used in the codebase rg -l "groq" --type ts # Check for any GROQ-related error handling rg "groq.*error" -i --type ts # Check for error type definitions rg "ErrorType\." --type tsLength of output: 1145
Script:
#!/bin/bash # Let's check the error types enum definition rg "enum ErrorType" -A 20 --type ts # Let's also check the content of error.ts to understand the GROQ error handling cat apps/web/utils/error.tsLength of output: 4446
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (5)
apps/web/app/api/user/settings/route.ts
(1 hunks)apps/web/env.ts
(1 hunks)apps/web/package.json
(1 hunks)apps/web/utils/error.ts
(2 hunks)apps/web/utils/llms/index.ts
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- apps/web/app/api/user/settings/route.ts
- apps/web/package.json
- apps/web/utils/error.ts
🔇 Additional comments (3)
apps/web/utils/llms/index.ts (2)
11-11
: LGTM! Import follows established patterns.
The GROQ SDK import follows the same convention as other AI provider imports.
69-79
: LGTM! Implementation follows established patterns.
The GROQ provider implementation maintains consistency with other providers in terms of:
- API key validation
- Model fallback behavior
- Return object structure
apps/web/env.ts (1)
13-13
: LGTM! Consider adding documentation for the new environment variable.
The addition of GROQ_API_KEY
follows the established pattern for AI provider keys and is correctly implemented as an optional server-side environment variable.
Consider adding a comment above the variable to document its purpose and usage, similar to how you might document it in your .env.example
file.
Let's verify the usage of this environment variable across the codebase:
✅ Verification successful
The GROQ_API_KEY environment variable is properly integrated and validated
The verification shows that the GROQ_API_KEY is:
- Correctly defined in
env.ts
as an optional environment variable - Properly used in
utils/llms/index.ts
with appropriate error handling:- Checks for both direct API key and environment variable
- Throws clear error message if neither is available
- Used to initialize the GROQ provider with proper fallback logic
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for GROQ_API_KEY usage to ensure proper error handling
rg "GROQ_API_KEY" -A 5
Length of output: 1082
apps/web/utils/error.ts
Outdated
export function isGroqInvalidApiKeyError(error: APICallError): boolean { | ||
return ( | ||
error.message.includes("Invalid API key") || | ||
error.message.includes("Authentication failed") | ||
); | ||
} | ||
|
||
export function isGroqRateLimitError(error: APICallError): boolean { | ||
return ( | ||
error.message.includes("Rate limit exceeded") || | ||
error.message.includes("Too many requests") | ||
); | ||
} | ||
|
||
export function isGroqQuotaExceededError(error: APICallError): boolean { | ||
return ( | ||
error.message.includes("Quota exceeded") || | ||
error.message.includes("Usage limit exceeded") | ||
); | ||
} | ||
|
||
function isKnownGroqError(error: APICallError): boolean { | ||
return ( | ||
isGroqInvalidApiKeyError(error) || | ||
isGroqRateLimitError(error) || | ||
isGroqQuotaExceededError(error) | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did you actually check this worked or just added what you thought made sense?
The reason for these checks is just to help with Sentry error reporting (and then also report errors back to the user if we notice errors pop up).
But if it was just a guess at what the error messages are, then I think we can remove this code for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure about the exact error messages, but groq does have rate limit and invalid api key error in docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Removed ✅
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just left one note about Groq errors
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Outside diff range and nitpick comments (2)
apps/web/utils/error-messages/index.ts (1)
62-64
: Consider adding error documentation.While the error messages are clear, it would be helpful to add JSDoc comments describing when these errors occur and how to resolve them, similar to other error handling implementations.
Here's a suggested improvement:
+ /** Thrown when the GROQ API key is invalid or not provided */ GROQ_INVALID_API_KEY: "Groq invalid API key", + /** Thrown when too many requests are made to GROQ API in a short time */ GROQ_RATE_LIMIT_ERROR: "Groq rate limit error", + /** Thrown when the GROQ API quota/credits are exhausted */ GROQ_QUOTA_EXCEEDED: "Groq quota exceeded",apps/web/utils/llms/index.ts (1)
72-82
: Add documentation for GROQ configuration.Consider adding JSDoc comments to document:
- Supported GROQ models
- Configuration requirements
- Any rate limits or quotas
- Region/infrastructure considerations
This will help users understand GROQ-specific requirements and limitations.
Example documentation:
/** * GROQ Provider Configuration * * Supported Models: * - LLAMA_3_70B_GROQ * * Configuration: * - Requires GROQ API key via settings or GROQ_API_KEY env variable * * @throws {Error} If API key is not provided * @throws {Error} If unsupported model is specified */ if (provider === Provider.GROQ) { // ... existing implementation }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (3)
apps/web/utils/error-messages/index.ts
(1 hunks)apps/web/utils/llms/index.ts
(4 hunks)apps/web/utils/usage.ts
(1 hunks)
🔇 Additional comments (8)
apps/web/utils/error-messages/index.ts (1)
62-64
: LGTM! Error types are well-defined and follow existing patterns.
The new GROQ error types cover the essential error scenarios (authentication, rate limits, quotas) and maintain consistency with existing error handling patterns.
Let's verify that these error types are properly utilized in the error handling logic:
✅ Verification successful
Error types are properly implemented and utilized in error handling logic
The GROQ error types are correctly integrated into the error handling system:
- Used in
llms/index.ts
for proper error classification and user notification - Each error type (invalid API key, rate limit, quota exceeded) is mapped to appropriate error handling calls via
addUserErrorMessage
- Implementation follows the same pattern as other providers in the codebase
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the usage of new GROQ error types in error handling code
# Expected: Find references to these error types in error handling logic
# Search for GROQ error handling
rg -l "GROQ_(INVALID_API_KEY|RATE_LIMIT_ERROR|QUOTA_EXCEEDED)" --type ts
# Search for error handling functions that might use these types
ast-grep --pattern 'function $NAME($ARGS) {
$$$
GROQ_$$$
$$$
}'
Length of output: 214
Script:
#!/bin/bash
# Let's examine how these error types are used in the found files
# Check error handling in llms/index.ts
rg "GROQ_" apps/web/utils/llms/index.ts -B 2 -A 2
# Look for error mapping or handling patterns
ast-grep --pattern 'catch ($ERROR) {
$$$
GROQ_$$$
$$$
}'
# Check for switch/if statements handling these errors
ast-grep --pattern 'if ($CONDITION) {
$$$
GROQ_$$$
$$$
}'
Length of output: 852
apps/web/utils/usage.ts (4)
40-41
: LGTM! Good practice introducing the MILLION constant.
The introduction of the MILLION
constant improves code maintainability by eliminating magic numbers and standardizing the division factor across all cost calculations.
49-65
: LGTM! Cost calculations are accurate and well-structured.
The cost calculations for existing models are:
- Correctly updated to use the
MILLION
constant - Accurately reflect the provider pricing pages
- Well-organized by provider
Also applies to: 84-99
100-103
: Verify GROQ model identifier and pricing.
While the pricing structure is implemented correctly, let's verify:
- Is "llama3-groq-70b-8192-tool-use-preview" the official model identifier?
- Are the input/output costs intentionally set to the same value (0.89/MILLION)?
Consider adding a comment explaining why input/output costs are equal, as this differs from other providers' typical pricing models.
Line range hint 107-122
: Fix typo in function name and enhance error handling.
- The function name has a typo: "calcuateCost" should be "calculateCost"
- Silently returning 0 for unknown models could mask configuration errors
Consider this improvement:
-function calcuateCost(
+function calculateCost(
model: string,
usage: {
promptTokens: number;
completionTokens: number;
},
): number {
- if (!costs[model]) return 0;
+ if (!costs[model]) {
+ console.warn(`No cost configuration found for model: ${model}`);
+ return 0;
+ }
const { input, output } = costs[model];
return usage.promptTokens * input + usage.completionTokens * output;
}
Don't forget to update all references to this function in other files.
✅ Verification successful
Fix typo in function name and add error logging for unknown models
- Rename
calcuateCost
tocalculateCost
inapps/web/utils/usage.ts
(2 occurrences) - Add warning log for unknown model costs as suggested
The function is only used locally within the same file, so no other files need to be updated.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Find all references to the misspelled function
rg "calcuateCost" --type ts
Length of output: 141
Script:
#!/bin/bash
# Check if there are any references to the correct spelling
rg "calculateCost" --type ts
# Get more context around the usage
rg "calcuateCost" -B 2 -A 2 --type ts
Length of output: 475
apps/web/utils/llms/index.ts (3)
11-11
: LGTM: Import statement is correctly placed.
The GROQ SDK import is appropriately grouped with other provider SDK imports.
20-22
: LGTM: Error type imports are well organized.
The GROQ error types are properly imported and grouped with other provider error types.
257-279
: LGTM: Error handling is comprehensive.
The error handling implementation for GROQ follows the established pattern and covers key error scenarios.
Let's verify that all GROQ error types are covered:
if (provider === Provider.GROQ) { | ||
if (!aiApiKey && !env.GROQ_API_KEY) { | ||
throw new Error("GROQ API key is not set"); | ||
} | ||
const model = aiModel || Model.LLAMA_3_70B_GROQ; | ||
return { | ||
provider: Provider.GROQ, | ||
model, | ||
llmModel: createGroq({ apiKey: aiApiKey || env.GROQ_API_KEY })(model), | ||
}; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance GROQ provider implementation.
While the basic implementation is functional, consider these improvements:
- The error message could be more descriptive (as suggested in past reviews).
- Add model validation to prevent usage of unsupported models.
- Consider documenting if GROQ requires any region configuration like Bedrock does.
Apply these improvements:
if (provider === Provider.GROQ) {
if (!aiApiKey && !env.GROQ_API_KEY) {
- throw new Error("GROQ API key is not set");
+ throw new Error(
+ "GROQ API key is not set. Please provide it either through AI settings or GROQ_API_KEY environment variable"
+ );
}
const model = aiModel || Model.LLAMA_3_70B_GROQ;
+ const supportedModels = [Model.LLAMA_3_70B_GROQ];
+ if (!supportedModels.includes(model)) {
+ throw new Error(`Model ${model} is not supported by GROQ provider`);
+ }
+ // TODO: Document if GROQ requires region configuration
return {
provider: Provider.GROQ,
model,
llmModel: createGroq({ apiKey: aiApiKey || env.GROQ_API_KEY })(model),
};
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
if (provider === Provider.GROQ) { | |
if (!aiApiKey && !env.GROQ_API_KEY) { | |
throw new Error("GROQ API key is not set"); | |
} | |
const model = aiModel || Model.LLAMA_3_70B_GROQ; | |
return { | |
provider: Provider.GROQ, | |
model, | |
llmModel: createGroq({ apiKey: aiApiKey || env.GROQ_API_KEY })(model), | |
}; | |
} | |
if (provider === Provider.GROQ) { | |
if (!aiApiKey && !env.GROQ_API_KEY) { | |
throw new Error( | |
"GROQ API key is not set. Please provide it either through AI settings or GROQ_API_KEY environment variable" | |
); | |
} | |
const model = aiModel || Model.LLAMA_3_70B_GROQ; | |
const supportedModels = [Model.LLAMA_3_70B_GROQ]; | |
if (!supportedModels.includes(model)) { | |
throw new Error(`Model ${model} is not supported by GROQ provider`); | |
} | |
// TODO: Document if GROQ requires region configuration | |
return { | |
provider: Provider.GROQ, | |
model, | |
llmModel: createGroq({ apiKey: aiApiKey || env.GROQ_API_KEY })(model), | |
}; | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (1)
apps/web/app/(app)/settings/ModelSection.tsx (1)
102-102
: Consider type safety and error message sanitization.While including the specific error message improves debugging, consider:
- Adding type safety for
res.error
- Sanitizing the error message before displaying it to prevent potential XSS
Consider this safer implementation:
- description: `There was an error updating the settings. ${res.error}`, + description: `There was an error updating the settings. ${ + typeof res.error === 'string' ? + res.error.slice(0, 200) : 'Unknown error' + }`,
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (3)
apps/web/app/(app)/settings/ModelSection.tsx
(1 hunks)apps/web/app/api/user/settings/route.ts
(2 hunks)apps/web/utils/llms/config.ts
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- apps/web/app/api/user/settings/route.ts
- apps/web/utils/llms/config.ts
🔇 Additional comments (1)
apps/web/app/(app)/settings/ModelSection.tsx (1)
Line range hint 1-180
: Verify GROQ provider integration.
The code supports multiple providers through providerOptions
, but GROQ is not visible in the provider configuration. This seems inconsistent with the PR's objective of adding GROQ support.
Let's verify the provider configuration:
Would you like help implementing the GROQ provider configuration?
@0xrushi could you also sign the license please. It's one of the pending checks |
Summary by CodeRabbit
Release Notes
New Features
GROQ_API_KEY
for server configuration.Bug Fixes
Chores
@ai-sdk/groq
to the project for GROQ support.