Remove provider API keys from config, rely on environment variables for those
This commit is contained in:
parent
618b3ffd5f
commit
469d993542
9 changed files with 56 additions and 56 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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):
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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():
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 = [
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue