summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-08-19 23:28:03 +0300
committerPaul Buetow <paul@buetow.org>2025-08-19 23:28:03 +0300
commit507b84f2442eecf7422738b66dc29417870cda52 (patch)
tree4daa19839a4cf237f1eb3254889dd20246519180
parentfd8e2fe8177305c9271d12c90cc6ad2ed73a1673 (diff)
config: apply HEXAI_* env even without config file; docs: clarify Copilot key; prefer HEXAI_COPILOT_API_KEY in builders
-rw-r--r--README.md2
-rw-r--r--internal/appconfig/config.go22
-rw-r--r--internal/hexaicli/run.go6
-rw-r--r--internal/hexailsp/run.go6
4 files changed, 22 insertions, 14 deletions
diff --git a/README.md b/README.md
index 28d9348..679ef05 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,7 @@ Ensure `HEXAI_OPENAI_API_KEY` (or `OPENAI_API_KEY`) or `COPILOT_API_KEY` is set
- `HEXAI_OLLAMA_MODEL`, `HEXAI_OLLAMA_BASE_URL`, `HEXAI_OLLAMA_TEMPERATURE`
- API keys:
- OpenAI: prefer `HEXAI_OPENAI_API_KEY`, falling back to `OPENAI_API_KEY`.
- - Copilot: use `COPILOT_API_KEY`.
+ - Copilot: prefer `HEXAI_COPILOT_API_KEY`, falling back to `COPILOT_API_KEY`.
### Selecting a provider
diff --git a/internal/appconfig/config.go b/internal/appconfig/config.go
index 58bcc3a..6d95da2 100644
--- a/internal/appconfig/config.go
+++ b/internal/appconfig/config.go
@@ -66,18 +66,18 @@ func Load(logger *log.Logger) App {
return cfg // Return defaults if no logger is provided (e.g. in tests)
}
- configPath, err := getConfigPath()
- if err != nil {
- logger.Printf("%v", err)
- return cfg
- }
-
- fileCfg, err := loadFromFile(configPath, logger)
- if err != nil {
- return cfg
- }
+ configPath, err := getConfigPath()
+ if err != nil {
+ logger.Printf("%v", err)
+ // Even if config path cannot be resolved, still allow env overrides below.
+ } else {
+ if fileCfg, err := loadFromFile(configPath, logger); err == nil && fileCfg != nil {
+ cfg.mergeWith(fileCfg)
+ }
+ // When the config file is missing or invalid, we keep defaults and still
+ // apply any environment overrides below.
+ }
- cfg.mergeWith(fileCfg)
// Environment overrides (take precedence over file)
if envCfg := loadFromEnv(logger); envCfg != nil {
cfg.mergeWith(envCfg)
diff --git a/internal/hexaicli/run.go b/internal/hexaicli/run.go
index 8cd5c82..14eff4f 100644
--- a/internal/hexaicli/run.go
+++ b/internal/hexaicli/run.go
@@ -88,7 +88,11 @@ func newClientFromConfig(cfg appconfig.App) (llm.Client, error) {
if strings.TrimSpace(oaKey) == "" {
oaKey = os.Getenv("OPENAI_API_KEY")
}
- cpKey := os.Getenv("COPILOT_API_KEY")
+ // Prefer HEXAI_COPILOT_API_KEY; fall back to COPILOT_API_KEY
+ cpKey := os.Getenv("HEXAI_COPILOT_API_KEY")
+ if strings.TrimSpace(cpKey) == "" {
+ cpKey = os.Getenv("COPILOT_API_KEY")
+ }
return llm.NewFromConfig(llmCfg, oaKey, cpKey)
}
diff --git a/internal/hexailsp/run.go b/internal/hexailsp/run.go
index 0d488f0..366d71c 100644
--- a/internal/hexailsp/run.go
+++ b/internal/hexailsp/run.go
@@ -82,7 +82,11 @@ func buildClientIfNil(cfg appconfig.App, client llm.Client) llm.Client {
if strings.TrimSpace(oaKey) == "" {
oaKey = os.Getenv("OPENAI_API_KEY")
}
- cpKey := os.Getenv("COPILOT_API_KEY")
+ // Prefer HEXAI_COPILOT_API_KEY; fall back to COPILOT_API_KEY
+ cpKey := os.Getenv("HEXAI_COPILOT_API_KEY")
+ if strings.TrimSpace(cpKey) == "" {
+ cpKey = os.Getenv("COPILOT_API_KEY")
+ }
if c, err := llm.NewFromConfig(llmCfg, oaKey, cpKey); err != nil {
logging.Logf("lsp ", "llm disabled: %v", err)
return nil