summaryrefslogtreecommitdiff
path: root/internal/appconfig
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-19 22:52:48 +0300
committerPaul Buetow <paul@buetow.org>2025-09-19 22:52:48 +0300
commiteb72b06fe8e62cb77af73f6dc558d384a5a5fe80 (patch)
treeefeb1165b9fbcb69a4ee675dba7bdc8c28fee3aa /internal/appconfig
parentacc400768153a7bfda1413f15579c9455b877c87 (diff)
fix
Diffstat (limited to 'internal/appconfig')
-rw-r--r--internal/appconfig/config.go82
1 files changed, 71 insertions, 11 deletions
diff --git a/internal/appconfig/config.go b/internal/appconfig/config.go
index 2274aee..9119688 100644
--- a/internal/appconfig/config.go
+++ b/internal/appconfig/config.go
@@ -247,9 +247,36 @@ type sectionStats struct {
}
type sectionOpenAI struct {
- Model string `toml:"model"`
- BaseURL string `toml:"base_url"`
- Temperature *float64 `toml:"temperature"`
+ Model string `toml:"model"`
+ BaseURL string `toml:"base_url"`
+ Temperature *float64 `toml:"temperature"`
+ Presets map[string]string `toml:"presets"`
+}
+
+func (s sectionOpenAI) isZero() bool {
+ return strings.TrimSpace(s.Model) == "" && strings.TrimSpace(s.BaseURL) == "" && s.Temperature == nil && len(s.Presets) == 0
+}
+
+func (s sectionOpenAI) resolvedModel() string {
+ model := strings.TrimSpace(s.Model)
+ if model == "" {
+ return ""
+ }
+ if len(s.Presets) == 0 {
+ return model
+ }
+ if mapped := strings.TrimSpace(s.Presets[model]); mapped != "" {
+ return mapped
+ }
+ lower := strings.ToLower(model)
+ for k, v := range s.Presets {
+ if strings.ToLower(strings.TrimSpace(k)) == lower {
+ if mapped := strings.TrimSpace(v); mapped != "" {
+ return mapped
+ }
+ }
+ }
+ return model
}
type sectionCopilot struct {
@@ -380,10 +407,10 @@ func (fc *fileConfig) toApp() App {
}
// openai
- if (fc.OpenAI != sectionOpenAI{}) || fc.OpenAI.Temperature != nil {
+ if !fc.OpenAI.isZero() || fc.OpenAI.Temperature != nil {
tmp := App{
OpenAIBaseURL: fc.OpenAI.BaseURL,
- OpenAIModel: fc.OpenAI.Model,
+ OpenAIModel: fc.OpenAI.resolvedModel(),
OpenAITemperature: fc.OpenAI.Temperature,
}
out.mergeProviderFields(&tmp)
@@ -939,13 +966,46 @@ func loadFromEnv(logger *log.Logger) *App {
any = true
}
+ modelForce := strings.TrimSpace(getenv("HEXAI_MODEL_FORCE"))
+ modelGeneric := strings.TrimSpace(getenv("HEXAI_MODEL"))
+ providerLower := strings.ToLower(strings.TrimSpace(out.Provider))
+ forceUsed := false
+ genericUsed := false
+ pickModel := func(providerName, specific string) (string, bool) {
+ specific = strings.TrimSpace(specific)
+ nameLower := strings.ToLower(strings.TrimSpace(providerName))
+ if modelForce != "" {
+ if providerLower == nameLower {
+ forceUsed = true
+ return modelForce, true
+ }
+ if providerLower == "" && !forceUsed {
+ forceUsed = true
+ return modelForce, true
+ }
+ }
+ if specific != "" {
+ return specific, true
+ }
+ if modelGeneric != "" {
+ if providerLower == nameLower {
+ return modelGeneric, true
+ }
+ if providerLower == "" && !genericUsed {
+ genericUsed = true
+ return modelGeneric, true
+ }
+ }
+ return "", false
+ }
+
// Provider-specific
if s := getenv("HEXAI_OPENAI_BASE_URL"); s != "" {
out.OpenAIBaseURL = s
any = true
}
- if s := getenv("HEXAI_OPENAI_MODEL"); s != "" {
- out.OpenAIModel = s
+ if model, ok := pickModel("openai", getenv("HEXAI_OPENAI_MODEL")); ok {
+ out.OpenAIModel = model
any = true
}
if f, ok := parseFloatPtr("HEXAI_OPENAI_TEMPERATURE"); ok {
@@ -957,8 +1017,8 @@ func loadFromEnv(logger *log.Logger) *App {
out.OllamaBaseURL = s
any = true
}
- if s := getenv("HEXAI_OLLAMA_MODEL"); s != "" {
- out.OllamaModel = s
+ if model, ok := pickModel("ollama", getenv("HEXAI_OLLAMA_MODEL")); ok {
+ out.OllamaModel = model
any = true
}
if f, ok := parseFloatPtr("HEXAI_OLLAMA_TEMPERATURE"); ok {
@@ -970,8 +1030,8 @@ func loadFromEnv(logger *log.Logger) *App {
out.CopilotBaseURL = s
any = true
}
- if s := getenv("HEXAI_COPILOT_MODEL"); s != "" {
- out.CopilotModel = s
+ if model, ok := pickModel("copilot", getenv("HEXAI_COPILOT_MODEL")); ok {
+ out.CopilotModel = model
any = true
}
if f, ok := parseFloatPtr("HEXAI_COPILOT_TEMPERATURE"); ok {