Remove provider API keys from config, rely on environment variables for those

This commit is contained in:
Yiorgis Gozadinos 2025-10-23 13:50:28 +03:00
parent 618b3ffd5f
commit 469d993542
No known key found for this signature in database
9 changed files with 56 additions and 56 deletions

View file

@ -98,16 +98,28 @@ providers:
qa_base_url: "" qa_base_url: ""
research_base_url: "" research_base_url: ""
api_keys:
voyage: ""
openai: ""
anthropic: ""
cohere: ""
a2a: a2a:
max_contexts: 1000 max_contexts: 1000
``` ```
## API Keys
API keys are configured through **environment variables**, not in the YAML file.
```bash
# OpenAI
export OPENAI_API_KEY=your-key-here
# Anthropic
export ANTHROPIC_API_KEY=your-key-here
# Voyage AI
export VOYAGE_API_KEY=your-key-here
# Cohere
export CO_API_KEY=your-key-here
```
## File Monitoring ## File Monitoring
Set directories to monitor for automatic indexing: Set directories to monitor for automatic indexing:
@ -145,10 +157,12 @@ embeddings:
provider: voyageai provider: voyageai
model: voyage-3.5 model: voyage-3.5
vector_dim: 1024 vector_dim: 1024
```
providers: Set your API key via environment variable:
api_keys:
voyage: your-api-key ```bash
export VOYAGE_API_KEY=your-api-key
``` ```
### OpenAI ### OpenAI
@ -160,10 +174,12 @@ embeddings:
provider: openai provider: openai
model: text-embedding-3-small # or text-embedding-3-large model: text-embedding-3-small # or text-embedding-3-large
vector_dim: 1536 vector_dim: 1536
```
providers: Set your API key via environment variable:
api_keys:
openai: your-api-key ```bash
export OPENAI_API_KEY=your-api-key
``` ```
### vLLM ### vLLM
@ -207,10 +223,12 @@ OpenAI QA is included in the default installation:
qa: qa:
provider: openai provider: openai
model: gpt-4o-mini # or gpt-4, gpt-3.5-turbo, etc. model: gpt-4o-mini # or gpt-4, gpt-3.5-turbo, etc.
```
providers: Set your API key via environment variable:
api_keys:
openai: your-api-key ```bash
export OPENAI_API_KEY=your-api-key
``` ```
### Anthropic ### Anthropic
@ -221,10 +239,12 @@ Anthropic QA is included in the default installation:
qa: qa:
provider: anthropic provider: anthropic
model: claude-3-5-haiku-20241022 # or claude-3-5-sonnet-20241022, etc. model: claude-3-5-haiku-20241022 # or claude-3-5-sonnet-20241022, etc.
```
providers: Set your API key via environment variable:
api_keys:
anthropic: your-api-key ```bash
export ANTHROPIC_API_KEY=your-api-key
``` ```
### vLLM ### vLLM
@ -296,10 +316,12 @@ Cohere reranking is included in the default installation:
reranking: reranking:
provider: cohere provider: cohere
model: rerank-v3.5 model: rerank-v3.5
```
providers: Set your API key via environment variable:
api_keys:
cohere: your-api-key ```bash
export CO_API_KEY=your-api-key
``` ```
### vLLM ### vLLM

View file

@ -9,7 +9,6 @@ from haiku.rag.config.loader import (
) )
from haiku.rag.config.models import ( from haiku.rag.config.models import (
A2AConfig, A2AConfig,
APIKeysConfig,
AppConfig, AppConfig,
EmbeddingsConfig, EmbeddingsConfig,
LanceDBConfig, LanceDBConfig,
@ -35,7 +34,6 @@ __all__ = [
"ProcessingConfig", "ProcessingConfig",
"OllamaConfig", "OllamaConfig",
"VLLMConfig", "VLLMConfig",
"APIKeysConfig",
"ProvidersConfig", "ProvidersConfig",
"A2AConfig", "A2AConfig",
"find_config_file", "find_config_file",
@ -54,14 +52,3 @@ else:
# Check for deprecated .env file # Check for deprecated .env file
check_for_deprecated_env() check_for_deprecated_env()
# Export API keys to os.environ for provider libraries
if Config.providers.api_keys.openai:
os.environ["OPENAI_API_KEY"] = Config.providers.api_keys.openai
if Config.providers.api_keys.voyage:
os.environ["VOYAGE_API_KEY"] = Config.providers.api_keys.voyage
if Config.providers.api_keys.anthropic:
os.environ["ANTHROPIC_API_KEY"] = Config.providers.api_keys.anthropic
if Config.providers.api_keys.cohere:
# Cohere SDK expects CO_API_KEY (not COHERE_API_KEY)
os.environ["CO_API_KEY"] = Config.providers.api_keys.cohere

View file

@ -90,7 +90,6 @@ def generate_default_config() -> dict:
"qa_base_url": "", "qa_base_url": "",
"research_base_url": "", "research_base_url": "",
}, },
"api_keys": {"voyage": "", "openai": "", "anthropic": "", "cohere": ""},
}, },
"a2a": {"max_contexts": 1000}, "a2a": {"max_contexts": 1000},
} }
@ -126,10 +125,6 @@ def load_config_from_env() -> dict:
"VLLM_RERANK_BASE_URL": ("providers", "vllm", "rerank_base_url"), "VLLM_RERANK_BASE_URL": ("providers", "vllm", "rerank_base_url"),
"VLLM_QA_BASE_URL": ("providers", "vllm", "qa_base_url"), "VLLM_QA_BASE_URL": ("providers", "vllm", "qa_base_url"),
"VLLM_RESEARCH_BASE_URL": ("providers", "vllm", "research_base_url"), "VLLM_RESEARCH_BASE_URL": ("providers", "vllm", "research_base_url"),
"VOYAGE_API_KEY": ("providers", "api_keys", "voyage"),
"OPENAI_API_KEY": ("providers", "api_keys", "openai"),
"ANTHROPIC_API_KEY": ("providers", "api_keys", "anthropic"),
"COHERE_API_KEY": ("providers", "api_keys", "cohere"),
"A2A_MAX_CONTEXTS": ("a2a", "max_contexts"), "A2A_MAX_CONTEXTS": ("a2a", "max_contexts"),
} }

View file

@ -56,17 +56,9 @@ class VLLMConfig(BaseModel):
research_base_url: str = "" research_base_url: str = ""
class APIKeysConfig(BaseModel):
voyage: str = ""
openai: str = ""
anthropic: str = ""
cohere: str = ""
class ProvidersConfig(BaseModel): class ProvidersConfig(BaseModel):
ollama: OllamaConfig = Field(default_factory=OllamaConfig) ollama: OllamaConfig = Field(default_factory=OllamaConfig)
vllm: VLLMConfig = Field(default_factory=VLLMConfig) vllm: VLLMConfig = Field(default_factory=VLLMConfig)
api_keys: APIKeysConfig = Field(default_factory=APIKeysConfig)
class A2AConfig(BaseModel): class A2AConfig(BaseModel):

View file

@ -1,4 +1,3 @@
from haiku.rag.config import Config
from haiku.rag.reranking.base import RerankerBase from haiku.rag.reranking.base import RerankerBase
from haiku.rag.store.models.chunk import Chunk from haiku.rag.store.models.chunk import Chunk
@ -12,7 +11,8 @@ except ImportError as e:
class CohereReranker(RerankerBase): class CohereReranker(RerankerBase):
def __init__(self): def __init__(self):
self._client = cohere.ClientV2(api_key=Config.providers.api_keys.cohere) # Cohere SDK reads CO_API_KEY from environment by default
self._client = cohere.ClientV2()
async def rerank( async def rerank(
self, query: str, chunks: list[Chunk], top_n: int = 10 self, query: str, chunks: list[Chunk], top_n: int = 10

View file

@ -112,7 +112,6 @@ def test_load_config_from_env(monkeypatch):
monkeypatch.setenv("EMBEDDINGS_VECTOR_DIM", "1536") monkeypatch.setenv("EMBEDDINGS_VECTOR_DIM", "1536")
monkeypatch.setenv("QA_PROVIDER", "anthropic") monkeypatch.setenv("QA_PROVIDER", "anthropic")
monkeypatch.setenv("QA_MODEL", "claude-3-haiku") monkeypatch.setenv("QA_MODEL", "claude-3-haiku")
monkeypatch.setenv("OPENAI_API_KEY", "test-key")
config = load_config_from_env() config = load_config_from_env()
@ -122,7 +121,6 @@ def test_load_config_from_env(monkeypatch):
assert config["embeddings"]["vector_dim"] == "1536" assert config["embeddings"]["vector_dim"] == "1536"
assert config["qa"]["provider"] == "anthropic" assert config["qa"]["provider"] == "anthropic"
assert config["qa"]["model"] == "claude-3-haiku" assert config["qa"]["model"] == "claude-3-haiku"
assert config["providers"]["api_keys"]["openai"] == "test-key"
def test_load_config_from_env_empty(): def test_load_config_from_env_empty():

View file

@ -1,3 +1,5 @@
import os
import numpy as np import numpy as np
import pytest import pytest
@ -6,8 +8,8 @@ from haiku.rag.embeddings.ollama import Embedder as OllamaEmbedder
from haiku.rag.embeddings.openai import Embedder as OpenAIEmbedder from haiku.rag.embeddings.openai import Embedder as OpenAIEmbedder
from haiku.rag.embeddings.vllm import Embedder as VLLMEmbedder from haiku.rag.embeddings.vllm import Embedder as VLLMEmbedder
OPENAI_AVAILABLE = bool(Config.providers.api_keys.openai) OPENAI_AVAILABLE = bool(os.getenv("OPENAI_API_KEY"))
VOYAGEAI_AVAILABLE = bool(Config.providers.api_keys.voyage) VOYAGEAI_AVAILABLE = bool(os.getenv("VOYAGE_API_KEY"))
VLLM_EMBEDDINGS_AVAILABLE = bool(Config.providers.vllm.embeddings_base_url) VLLM_EMBEDDINGS_AVAILABLE = bool(Config.providers.vllm.embeddings_base_url)

View file

@ -1,3 +1,5 @@
import os
import pytest import pytest
from datasets import Dataset from datasets import Dataset
@ -6,8 +8,8 @@ from haiku.rag.client import HaikuRAG
from haiku.rag.config import Config from haiku.rag.config import Config
from haiku.rag.qa.agent import QuestionAnswerAgent from haiku.rag.qa.agent import QuestionAnswerAgent
OPENAI_AVAILABLE = bool(Config.providers.api_keys.openai) OPENAI_AVAILABLE = bool(os.getenv("OPENAI_API_KEY"))
ANTHROPIC_AVAILABLE = bool(Config.providers.api_keys.anthropic) ANTHROPIC_AVAILABLE = bool(os.getenv("ANTHROPIC_API_KEY"))
VLLM_QA_AVAILABLE = bool(Config.providers.vllm.qa_base_url) VLLM_QA_AVAILABLE = bool(Config.providers.vllm.qa_base_url)

View file

@ -1,3 +1,5 @@
import os
import pytest import pytest
from haiku.rag.config import Config from haiku.rag.config import Config
@ -5,7 +7,7 @@ from haiku.rag.reranking.base import RerankerBase
from haiku.rag.reranking.vllm import VLLMReranker from haiku.rag.reranking.vllm import VLLMReranker
from haiku.rag.store.models.chunk import Chunk from haiku.rag.store.models.chunk import Chunk
COHERE_AVAILABLE = bool(Config.providers.api_keys.cohere) COHERE_AVAILABLE = bool(os.getenv("CO_API_KEY"))
VLLM_RERANK_AVAILABLE = bool(Config.providers.vllm.rerank_base_url) VLLM_RERANK_AVAILABLE = bool(Config.providers.vllm.rerank_base_url)
chunks = [ chunks = [