mirror of
https://github.com/usestrix/strix.git
synced 2026-08-21 18:52:47 +02:00
Add Sign in with Grok mirroring the merged ChatGPT/Codex integration: a strix/config/grok.py OAuth module (PKCE loopback flow against auth.x.ai, refresh with cross-process locking, secure ~/.strix/subscription-auth.json store) plus grok/<model> routing through the OpenAI-compatible api.x.ai/v1 endpoint via a bearer-stamping chat-completions client. strix auth login grok / status / logout become provider-aware; subscription.py shares provider-agnostic auth-mode detection; Grok runs are marked zero-cost like other subscriptions. Uses a consumer subscription outside xAI own products, which xAI does not officially support; opt-in and experimental.
35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
"""Grok subscription routing through StrixProvider.get_model."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest import mock
|
|
|
|
from agents.models.openai_chatcompletions import OpenAIChatCompletionsModel
|
|
|
|
from strix.config import grok
|
|
from strix.config.models import StrixProvider
|
|
|
|
|
|
def test_grok_prefix_routes_to_chat_completions(monkeypatch) -> None: # type: ignore[no-untyped-def]
|
|
client = mock.MagicMock()
|
|
monkeypatch.setattr(grok, "get_subscription_client", lambda: client)
|
|
|
|
model = StrixProvider().get_model("grok/grok-4")
|
|
|
|
assert isinstance(model, OpenAIChatCompletionsModel)
|
|
# The provider strips the grok/ prefix and passes xAI's bare model slug.
|
|
assert model.model == "grok-4"
|
|
|
|
|
|
def test_non_subscription_model_is_not_hijacked_by_grok(monkeypatch) -> None: # type: ignore[no-untyped-def]
|
|
def _boom() -> object:
|
|
msg = "grok client must not be built for a non-grok model"
|
|
raise AssertionError(msg)
|
|
|
|
monkeypatch.setattr(grok, "get_subscription_client", _boom)
|
|
|
|
# A metered xai/* key model must fall through to the normal provider path,
|
|
# not the subscription route.
|
|
model = StrixProvider().get_model("xai/grok-4")
|
|
assert not (isinstance(model, OpenAIChatCompletionsModel) and model.model == "grok-4")
|