Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); added MiniMax, and made eval and compile configurable by MakiWinster72 · Pull Request #139 · VectifyAI/OpenKB · GitHub
Skip to content

added MiniMax, and made eval and compile configurable - #139

Open
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main
Open

added MiniMax, and made eval and compile configurable#139
MakiWinster72 wants to merge 8 commits into
VectifyAI:mainfrom
MakiWinster72:main

Conversation

@MakiWinster72

Copy link
Copy Markdown

Added MiniMax as an option during init. After init, generates .env at the project root and automatically uses XXX_API_KEY, only falling back to LLM_API_KEY for unknown providers — making it easy for users to edit base URL and key.

and made eval and compile configurable in config.yaml so that users who would otherwise hit their subscription rate limits can dial down the concurrency.

image

just after init
image

MakiWinster72and others added 8 commits June 24, 2026 07:16
…ig.yaml
- Add eval_concurrency and compile_concurrency to DEFAULT_CONFIG
- run_eval reads from <kb>/.openkb/config.yaml; falls back to
EVAL_CONCURRENCY
- compile_short_doc / compile_long_doc: param > config >
DEFAULT_COMPILE_CONCURRENCY
- openkb init writes both fields into new KB config.yaml
- Add --base-url CLI flag (-u) to `openkb init` for non-interactive
setup
- Prompt for base URL only when the chosen model's provider isn't in
_KNOWN_PUBLIC_PROVIDERS (openai, anthropic, gemini, deepseek, ...)
- Map the URL to the provider-specific *_API_BASE env var
(OPENAI_API_BASE, OLLAMA_API_BASE, ...) via _PROVIDER_TO_BASE_ENV
and write it alongside LLM_API_KEY in the KB-local .env (chmod 600)
- _setup_llm_key reads the env var and applies it to litellm.api_base
so LiteLLM uses the override on every request
- Emit a post-init reminder pointing the user at .env and
.openkb/config.yaml
- .env.example: document the *_API_BASE convention
- Tests: 9 new cases (public/custom provider, flag, key+url together,
blank skip, existing .env preserved, control-char/length rejection,
post-init reminder)
MiniMax ships two regional endpoints under the same ``minimax/`` LiteLLM
provider prefix (global vs China), so the generic base-URL skip for
known public providers doesn't apply. Detect ``minimax/`` models and
run a dedicated region picker instead; the chosen URL is written as
``MINIMAX_API_BASE`` in the KB-local .env.
- Add _MINIMAX_GLOBAL_URL / _MINIMAX_CHINA_URL constants
- Add ``minimax`` to _KNOWN_PUBLIC_PROVIDERS and
_PROVIDER_TO_BASE_ENV (-> MINIMAX_API_BASE)
- Add MINIMAX_API_KEY to _KNOWN_PROVIDER_KEYS so _setup_llm_key
propagates LLM_API_KEY to MiniMax for the Agents-SDK litellm provider
- _prompt_minimax_region(): interactive picker that re-prompts on
unrecognised input (1/Global default, 2/China) — a typo can't silently
route the user to the wrong region
- Non-TTY init falls back to the global endpoint silently; users who
need China there can pass --base-url explicitly
- Model picker text gains a MiniMax row (M2.7 / M3)
Tests: 9 new cases — global/china via picker, default-global under
non-TTY, --base-url overrides picker, invalid choice re-prompts,
key + URL written together, _KNOWN_PROVIDER_KEYS / _PROVIDER_TO_BASE_ENV
contain MiniMax, _setup_llm_key applies MINIMAX_API_BASE.
The region picker fired for ``minimax/`` models but its three short
lines were easy to miss in the scroll of surrounding model / API-key /
language prompts — users reported only seeing "key and language", which
meant the picker silently routed them to the wrong region (or the
model was never MiniMax to begin with).
- Add blank-line + box-drawing separators and a "── MiniMax region ──"
heading so the picker can't be confused with the prompts around it
- Header text now also explains *why* the picker appears ("two regional
endpoints under the same `minimax/` LiteLLM prefix")
- Options re-numbered as `[1]` / `[2]` to match the prompt text
- Test: new case covers the picker firing when the user TYPES the model
interactively, not only when --model is passed (catches future
regressions where the picker would be silently skipped)
- Tests: update wording assertions to match the new visible text
Previously, ``openkb init`` skipped writing .env entirely when the user
provided neither an API key nor a base URL. That left a freshly-initialised
KB without any discoverable target for credentials — users had to know
that ``LLM_API_KEY`` was the right name and that they could drop it into
a file the CLI hadn't created yet.
- .env is now ALWAYS created on init (chmod 0600), with commented
placeholders for every field the user skipped. Missing fields show
the exact env-var name to use (e.g. ``MINIMAX_API_BASE`` for MiniMax,
``ANTHROPIC_API_BASE`` for Anthropic) so the user can copy the line
and uncomment it later.
- Refactor: pull the .env content builder into ``_build_env_content()``
so it's unit-testable in isolation and stays in sync with whatever
fields the active provider expects.
- Output message adapts: ``Saved to .env: ...`` when values were
written, ``Created .env with commented placeholders — fill in your
API key before running compile.`` when everything was empty.
Tests:
- 3 new tests cover the builder directly (no provider, provider +
active key, MiniMax-no-key)
- ``test_init_base_url_blank_prompt_still_writes_env_with_comments``
replaces the old "no .env" assertion with the new always-create
behaviour and verifies both placeholders appear commented and
chmod 600 is applied even for an all-comments file
- The ``LLM_API_KEY=sk...`` check elsewhere is replaced with a
line-by-line scan that catches active assignments even when the
string happens to appear inside a comment
Co-Authored-By: Claude <noreply@anthropic.com>
Every LiteLLM provider reads its own ``*_API_KEY`` env var
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``GEMINI_API_KEY``, ...)
and ``openkb init`` was writing everything under the generic
``LLM_API_KEY``. That works — ``_setup_llm_key`` propagated it to
every known provider — but the .env file then looked generic and
mysterious. Users reading the file wouldn't immediately see which
variable their OpenAI / Anthropic / MiniMax key should land in.
- Add ``_PROVIDER_KEY_ENV``: provider prefix → canonical LiteLLM
key env var. Sources (LiteLLM docs, verified):
* OPENAI_API_KEY docs.litellm.ai/docs/set_keys
* ANTHROPIC_API_KEY docs.litellm.ai/docs/providers/anthropic
* GEMINI_API_KEY docs.litellm.ai/docs/providers/gemini
* DEEPSEEK_API_KEY docs.litellm.ai/docs/providers/deepseek
* MISTRAL_API_KEY docs.litellm.ai/docs/providers/mistral
* MOONSHOT_API_KEY docs.litellm.ai/docs/providers/moonshot
* DASHSCOPE_API_KEY docs.litellm.ai/docs/providers/dashscope
* OPENROUTER_API_KEY docs.litellm.ai/docs/providers/openrouter
* MINIMAX_API_KEY user-specified
* ZHIPUAI_API_KEY LiteLLM renamed the provider to "Z.AI" but
the ``zhipuai/`` prefix is unchanged, so the
env var stays the same.
* ollama: no key (local server, ``None``)
* vllm: HOSTED_VLLM_API_KEY (optional, per LiteLLM docs)
- ``_build_env_content`` now writes the key under the provider-specific
name and renders its commented placeholder to match. Unknown / custom
providers fall back to ``LLM_API_KEY`` so legacy flows still work.
- ``_setup_llm_key`` reads the provider-specific env var FIRST and only
falls back to ``LLM_API_KEY`` when it's unset, so a user who follows
the new .env format never sees the spurious "no key found" warning.
- Keyless providers (ollama) get no key section at all — emitting a
placeholder would mislead the user into hunting for a credential
that doesn't exist.
Tests:
- Parametrised matrix covers all 10 known providers; asserts the
active line uses the right ``*_API_KEY`` env var
- ``_key_env_for_provider`` unit test (known / unknown / keyless)
- ``_setup_llm_key`` reads provider-specific env var directly
(no LLM_API_KEY needed)
- ``test_init_ollama_provider_no_key_section``: no ``_API_KEY=`` line
- Existing tests updated to assert on provider-specific env vars
(``OPENAI_API_KEY``, ``ANTHROPIC_API_KEY``, ``MINIMAX_API_KEY``,
``HOSTED_VLLM_API_KEY``) instead of the generic ``LLM_API_KEY``
Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@MakiWinster72