From e72553008bde701e36924d7fa04742e87bf77d45 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 8 Apr 2026 05:59:43 +0800 Subject: [PATCH 1/2] simplify LLM API key config: remove llm_api_key_env from config - Hardcode reading LLM_API_KEY env var instead of indirecting through config - Remove llm_api_key_env from DEFAULT_CONFIG, okb init prompts, and config.yaml - Provider-specific env vars (OPENAI_API_KEY, etc.) still work via LiteLLM auto-detection - One less config field, one less okb init step --- README.md | 1 - config.yaml.example | 1 - openkb/cli.py | 15 ++++++--------- openkb/config.py | 1 - tests/test_config.py | 3 --- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6485c0ec..ae2deccd 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,6 @@ Generated by `openkb init`, stored in `.openkb/config.yaml`: ```yaml model: gpt-5.4 # LLM model (any LiteLLM-supported provider) -api_key_env: LLM_API_KEY # Environment variable for LLM API key language: en # Wiki output language pageindex_threshold: 20 # PDF pages threshold for PageIndex pageindex_api_key_env: "" # (Optional) Environment variable for PageIndex Cloud API key diff --git a/config.yaml.example b/config.yaml.example index 85044ca5..8bcaca0e 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -1,5 +1,4 @@ model: gpt-5.4 # LLM model (any LiteLLM-supported provider) -api_key_env: LLM_API_KEY # Environment variable for API key language: en # Wiki output language pageindex_threshold: 20 # PDF pages threshold for PageIndex pageindex_api_key_env: "" # Env var name for PageIndex Cloud API key diff --git a/openkb/cli.py b/openkb/cli.py index 2741113a..7262883f 100644 --- a/openkb/cli.py +++ b/openkb/cli.py @@ -20,10 +20,9 @@ load_dotenv() -def _setup_llm_key(config: dict) -> None: - """Set LiteLLM API key from the configured env var (default: LLM_API_KEY).""" - env_var = config.get("api_key_env", DEFAULT_CONFIG["api_key_env"]) - api_key = os.environ.get(env_var, "") +def _setup_llm_key() -> None: + """Set LiteLLM API key from LLM_API_KEY env var if present.""" + api_key = os.environ.get("LLM_API_KEY", "") if api_key: litellm.api_key = api_key @@ -76,7 +75,7 @@ def _add_single_file(file_path: Path, kb_dir: Path) -> None: openkb_dir = kb_dir / ".openkb" config = load_config(openkb_dir / "config.yaml") - _setup_llm_key(config) + _setup_llm_key() model: str = config.get("model", DEFAULT_CONFIG["model"]) registry = HashRegistry(openkb_dir / "hashes.json") @@ -161,7 +160,6 @@ def init(): # Interactive prompts model = click.prompt("Model", default=DEFAULT_CONFIG["model"]) - api_key_env = click.prompt("API key env var", default=DEFAULT_CONFIG["api_key_env"]) language = click.prompt("Language", default=DEFAULT_CONFIG["language"]) pageindex_threshold = click.prompt( "PageIndex threshold (pages)", @@ -193,7 +191,6 @@ def init(): openkb_dir.mkdir() config = { "model": model, - "api_key_env": api_key_env, "language": language, "pageindex_threshold": pageindex_threshold, "pageindex_api_key_env": pageindex_api_key_env, @@ -255,7 +252,7 @@ def query(question, save): openkb_dir = kb_dir / ".openkb" config = load_config(openkb_dir / "config.yaml") - _setup_llm_key(config) + _setup_llm_key() model: str = config.get("model", DEFAULT_CONFIG["model"]) try: @@ -320,7 +317,7 @@ def lint(fix): openkb_dir = kb_dir / ".openkb" config = load_config(openkb_dir / "config.yaml") - _setup_llm_key(config) + _setup_llm_key() model: str = config.get("model", DEFAULT_CONFIG["model"]) # Structural lint diff --git a/openkb/config.py b/openkb/config.py index e36f308b..33bafb63 100644 --- a/openkb/config.py +++ b/openkb/config.py @@ -7,7 +7,6 @@ DEFAULT_CONFIG: dict[str, Any] = { "model": "gpt-5.4", - "api_key_env": "LLM_API_KEY", "language": "en", "pageindex_threshold": 20, "pageindex_api_key_env": "", # Set to env var name (e.g. PAGEINDEX_API_KEY) to use cloud PageIndex diff --git a/tests/test_config.py b/tests/test_config.py index 1f042427..09a9bf6f 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -5,7 +5,6 @@ def test_default_config_keys(): assert "model" in DEFAULT_CONFIG - assert "api_key_env" in DEFAULT_CONFIG assert "language" in DEFAULT_CONFIG assert "pageindex_threshold" in DEFAULT_CONFIG assert "pageindex_api_key_env" in DEFAULT_CONFIG @@ -13,7 +12,6 @@ def test_default_config_keys(): def test_default_config_values(): assert DEFAULT_CONFIG["model"] == "gpt-5.4" - assert DEFAULT_CONFIG["api_key_env"] == "LLM_API_KEY" assert DEFAULT_CONFIG["language"] == "en" assert DEFAULT_CONFIG["pageindex_threshold"] == 20 @@ -39,7 +37,6 @@ def test_save_load_roundtrip(tmp_path): assert loaded["model"] == "gpt-3.5-turbo" assert loaded["language"] == "fr" # Defaults fill in missing keys - assert loaded["api_key_env"] == DEFAULT_CONFIG["api_key_env"] assert loaded["pageindex_threshold"] == DEFAULT_CONFIG["pageindex_threshold"] From 55444d3e1646c22941c6931d36e3ddf4a1014ec8 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 8 Apr 2026 06:13:53 +0800 Subject: [PATCH 2/2] docs: add LiteLLM model name examples to README and okb init prompt --- README.md | 10 +++++++++- openkb/cli.py | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ae2deccd..d9df9be5 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ openkb lint OpenKB comes with [multi-LLM support](https://docs.litellm.ai/docs/providers) (e.g., OpenAI, Claude, Gemini) via [LiteLLM](https://github.com/BerriAI/litellm) (pinned to a [safe version](https://docs.litellm.ai/blog/security-update-march-2026)). -Create a `.env` file with your LLM API key. Choose your LLM during `openkb init` or edit [`.openkb/config.yaml`](#configuration). +Create a `.env` file with your LLM API key. Choose your LLM during `openkb init` or edit [`.openkb/config.yaml`](#configuration) (model names follow [LiteLLM format](https://docs.litellm.ai/docs/providers), e.g. `gpt-5.4`, `anthropic/claude-sonnet-4-6`). ```bash LLM_API_KEY=your_llm_api_key @@ -146,6 +146,14 @@ pageindex_threshold: 20 # PDF pages threshold for PageIndex pageindex_api_key_env: "" # (Optional) Environment variable for PageIndex Cloud API key ``` +Model names follow [LiteLLM format](https://docs.litellm.ai/docs/providers): + +| Provider | Model example | +|---|---| +| OpenAI | `gpt-5.4` | +| Anthropic | `anthropic/claude-sonnet-4-6` | +| Gemini | `gemini/gemini-3.1-pro-preview` | + ### PageIndex integration For long documents, relying solely on summaries often leads to information loss. diff --git a/openkb/cli.py b/openkb/cli.py index 7262883f..78ade3dc 100644 --- a/openkb/cli.py +++ b/openkb/cli.py @@ -159,7 +159,10 @@ def init(): return # Interactive prompts - model = click.prompt("Model", default=DEFAULT_CONFIG["model"]) + model = click.prompt( + "Model (e.g. gpt-5.4, anthropic/claude-sonnet-4-6, gemini/gemini-3.1-pro-preview)", + default=DEFAULT_CONFIG["model"], + ) language = click.prompt("Language", default=DEFAULT_CONFIG["language"]) pageindex_threshold = click.prompt( "PageIndex threshold (pages)",