Description
The codebase contains a GrokProvider implementation under grok_provider.py, but it is completely isolated from the rest of the application. It is never registered or initialised by the provider manager, lacks the standard constructor signature used by other AI providers, is not supported in the database configuration schemas, and is missing from both backend route validations and frontend dashboard forms.
Technical Details & Code Citations
1. Inconsistent Constructor Signature
In grok_provider.py:
class GrokProvider(AIProvider):
def __init__(self):
self.api_key = os.getenv("XAI_API_KEY")
Unlike other providers (Gemini, OpenAI, Perplexity), which accept api_key: str | None = None, GrokProvider takes no arguments. This signature mismatch will throw a TypeError when the manager attempts to initialise it using a database-resolved API key.
2. Missing Registration in ProviderManager
In provider_manager.py:
GrokProvider is neither imported nor registered in self.providers map:
self.providers = {
"gemini": GeminiProvider,
"openai": OpenAIProvider,
"perplexity": PerplexityProvider,
}
Furthermore, the credential mapper has no lookup key for grok:
credential_names = {
"gemini": "gemini_api_key",
"openai": "openai_api_key",
"perplexity": "perplexity_api_key",
}
3. Restricted API Schema Validation
In main.py, the backend blocks saving configuration updates if the provider is grok:
allowed_providers = {"gemini", "openai", "perplexity"}
if settings.ai_provider not in allowed_providers:
raise HTTPException(status_code=400, detail="Unsupported AI provider.")
Also, IntegrationSettings (Pydantic model) and _connected checks in main.py lack fields for grok_api_key.
4. Missing Frontend Controls
In main.jsx, the settings dropdown and default state configuration have no entry for Grok:
const defaultSettings = {
...
ai_provider: "gemini",
gemini_api_key: "",
openai_api_key: "",
perplexity_api_key: "",
...
};
Step-by-Step Proposed Fix
Step 1: Align Constructor Signature
Modify grok_provider.py to accept and respect an optional runtime api_key:
class GrokProvider(AIProvider):
- def __init__(self):
- self.api_key = os.getenv("XAI_API_KEY")
+ def __init__(self, api_key: str | None = None):
+ self.api_key = api_key or os.getenv("XAI_API_KEY")
Step 2: Register in ProviderManager
Update provider_manager.py:
+from .providers.grok_provider import GrokProvider
...
self.providers = {
"gemini": GeminiProvider,
"openai": OpenAIProvider,
"perplexity": PerplexityProvider,
+ "grok": GrokProvider,
}
...
credential_names = {
"gemini": "gemini_api_key",
"openai": "openai_api_key",
"perplexity": "perplexity_api_key",
+ "grok": "grok_api_key",
}
Step 3: Expand Backend Schemas & Routes
Modify main.py:
class IntegrationSettings(BaseModel):
...
perplexity_api_key: str | None = None
+ grok_api_key: str | None = None
def _connected(settings_doc: dict[str, Any]) -> dict[str, bool]:
return {
...
"ai_provider": bool(
settings_doc.get("gemini_api_key")
or settings_doc.get("openai_api_key")
or settings_doc.get("perplexity_api_key")
+ or settings_doc.get("grok_api_key")
),
}
@app.put("/settings/integrations")
async def update_integration_settings(...):
- allowed_providers = {"gemini", "openai", "perplexity"}
+ allowed_providers = {"gemini", "openai", "perplexity", "grok"}
Step 4: Add Frontend settings
Update main.jsx:
const defaultSettings = {
...
perplexity_api_key: "",
+ grok_api_key: "",
...
};
Add option to the selector UI and corresponding input element:
<select value={settings.ai_provider} onChange={(event) => setSettings({ ...settings, ai_provider: event.target.value })}>
<option value="gemini">Gemini</option>
<option value="openai">OpenAI</option>
<option value="perplexity">Perplexity</option>
+ <option value="grok">Grok</option>
</select>
<label>
Perplexity API key
<input type="password" value={settings.perplexity_api_key} onChange={(event) => setSettings({ ...settings, perplexity_api_key: event.target.value })} />
</label>
+ <label>
+ Grok API key
+ <input type="password" value={settings.grok_api_key} onChange={(event) => setSettings({ ...settings, grok_api_key: event.target.value })} />
+ </label>
Contribution Interest
Hello @vanshaggarwal27 . I noticed the Grok AI provider is currently isolated from the rest of the pipeline. I'd love to claim this issue to fully integrate it and submit a PR for GSSoC'26. Please assign this to me!
Description
The codebase contains a
GrokProviderimplementation under grok_provider.py, but it is completely isolated from the rest of the application. It is never registered or initialised by the provider manager, lacks the standard constructor signature used by other AI providers, is not supported in the database configuration schemas, and is missing from both backend route validations and frontend dashboard forms.Technical Details & Code Citations
1. Inconsistent Constructor Signature
In grok_provider.py:
Unlike other providers (Gemini, OpenAI, Perplexity), which accept
api_key: str | None = None,GrokProvidertakes no arguments. This signature mismatch will throw aTypeErrorwhen the manager attempts to initialise it using a database-resolved API key.2. Missing Registration in
ProviderManagerIn provider_manager.py:
GrokProvideris neither imported nor registered inself.providersmap:Furthermore, the credential mapper has no lookup key for
grok:3. Restricted API Schema Validation
In main.py, the backend blocks saving configuration updates if the provider is
grok:Also,
IntegrationSettings(Pydantic model) and_connectedchecks in main.py lack fields forgrok_api_key.4. Missing Frontend Controls
In main.jsx, the settings dropdown and default state configuration have no entry for Grok:
Step-by-Step Proposed Fix
Step 1: Align Constructor Signature
Modify grok_provider.py to accept and respect an optional runtime
api_key:Step 2: Register in
ProviderManagerUpdate provider_manager.py:
Step 3: Expand Backend Schemas & Routes
Modify main.py:
class IntegrationSettings(BaseModel): ... perplexity_api_key: str | None = None + grok_api_key: str | None = Nonedef _connected(settings_doc: dict[str, Any]) -> dict[str, bool]: return { ... "ai_provider": bool( settings_doc.get("gemini_api_key") or settings_doc.get("openai_api_key") or settings_doc.get("perplexity_api_key") + or settings_doc.get("grok_api_key") ), }@app.put("/settings/integrations") async def update_integration_settings(...): - allowed_providers = {"gemini", "openai", "perplexity"} + allowed_providers = {"gemini", "openai", "perplexity", "grok"}Step 4: Add Frontend settings
Update main.jsx:
const defaultSettings = { ... perplexity_api_key: "", + grok_api_key: "", ... };Add option to the selector UI and corresponding input element:
<select value={settings.ai_provider} onChange={(event) => setSettings({ ...settings, ai_provider: event.target.value })}> <option value="gemini">Gemini</option> <option value="openai">OpenAI</option> <option value="perplexity">Perplexity</option> + <option value="grok">Grok</option> </select><label> Perplexity API key <input type="password" value={settings.perplexity_api_key} onChange={(event) => setSettings({ ...settings, perplexity_api_key: event.target.value })} /> </label> + <label> + Grok API key + <input type="password" value={settings.grok_api_key} onChange={(event) => setSettings({ ...settings, grok_api_key: event.target.value })} /> + </label>Contribution Interest
Hello @vanshaggarwal27 . I noticed the Grok AI provider is currently isolated from the rest of the pipeline. I'd love to claim this issue to fully integrate it and submit a PR for GSSoC'26. Please assign this to me!