From 2647b2d4992f28f6553a35732c35693856762d25 Mon Sep 17 00:00:00 2001 From: Daniel Nguyen Date: Sat, 4 Jul 2026 00:29:55 +0800 Subject: [PATCH] feat(config): accept GROQ_API_KEY for Groq-hosted models Add GROQ_API_KEY as an accepted alias for the LLM key alongside LLM_API_KEY / OPENAI_API_KEY, so STRIX_LLM="groq/" works with a provider-native key. Groq models already route through LiteLLM (which mirrors the configured key to GROQ_API_KEY), so this wires up the alias plus docs and tests. Signed-off-by: Daniel Nguyen --- README.md | 9 +++++++++ strix/config/settings.py | 2 +- tests/test_config_loader.py | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b2882f6e4..a5c9d3005 100644 --- a/README.md +++ b/README.md @@ -235,6 +235,15 @@ export PERPLEXITY_API_KEY="your-api-key" # for search capabilities export STRIX_REASONING_EFFORT="high" # control thinking effort (default: high, quick scan: medium) ``` +Provider-native keys are also picked up automatically. For example, to use +[Groq's](https://console.groq.com/) fast inference you can set `GROQ_API_KEY` +directly instead of `LLM_API_KEY`: + +```bash +export STRIX_LLM="groq/llama-3.3-70b-versatile" +export GROQ_API_KEY="your-api-key" +``` + > [!NOTE] > Strix automatically saves your configuration to `~/.strix/cli-config.json`, so you don't have to re-enter it on every run. diff --git a/strix/config/settings.py b/strix/config/settings.py index 91fbdef14..04651d877 100644 --- a/strix/config/settings.py +++ b/strix/config/settings.py @@ -23,7 +23,7 @@ class LlmSettings(BaseSettings): model: str | None = Field(default=None, alias="STRIX_LLM") api_key: str | None = Field( default=None, - validation_alias=AliasChoices("LLM_API_KEY", "OPENAI_API_KEY"), + validation_alias=AliasChoices("LLM_API_KEY", "OPENAI_API_KEY", "GROQ_API_KEY"), ) api_base: str | None = Field( default=None, diff --git a/tests/test_config_loader.py b/tests/test_config_loader.py index 247c41ffe..f6b48e1f4 100644 --- a/tests/test_config_loader.py +++ b/tests/test_config_loader.py @@ -20,6 +20,7 @@ _LLM_ENV_KEYS = [ "STRIX_LLM", "LLM_API_KEY", "OPENAI_API_KEY", + "GROQ_API_KEY", "LLM_API_BASE", "OPENAI_API_BASE", "OPENAI_BASE_URL", @@ -150,6 +151,22 @@ def test_apply_config_override_invalidates_cache(tmp_path: Path) -> None: assert loader.load_settings().llm.model == "second-model" +# --------------------------------------------------------------------------- # +# LLM key aliases +# --------------------------------------------------------------------------- # + + +def test_groq_api_key_alias_populates_llm_key(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("GROQ_API_KEY", "gsk-test") + assert loader.load_settings().llm.api_key == "gsk-test" + + +def test_llm_api_key_takes_precedence_over_groq(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setenv("LLM_API_KEY", "primary") + monkeypatch.setenv("GROQ_API_KEY", "gsk-test") + assert loader.load_settings().llm.api_key == "primary" + + # --------------------------------------------------------------------------- # # persist_current # --------------------------------------------------------------------------- #