summaryrefslogtreecommitdiff
path: root/internal/appconfig/config_env_model_test.go
blob: e10fa5d86865c5cd7d49d3cecb1a8e41071438be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package appconfig

import (
	"log"
	"os"
	"testing"
)

// Test that HEXAI_MODEL applies to provider model fields and that
// provider-specific envs take precedence when both are set.
func TestEnv_GenericModelOverrideAndPrecedence(t *testing.T) {
	t.Setenv("HEXAI_MODEL", "gpt-5-codex")
	t.Setenv("HEXAI_PROVIDER", "openai")
	// No provider-specific env set yet: HEXAI_MODEL should flow into OpenAIModel
	cfg := Load(log.New(os.Stderr, "test ", 0))
	if cfg.OpenAIModel != "gpt-5-codex" {
		t.Fatalf("expected OpenAIModel=gpt-5-codex via HEXAI_MODEL, got %q", cfg.OpenAIModel)
	}

	// Now set a provider-specific model; it should win over HEXAI_MODEL
	t.Setenv("HEXAI_OPENAI_MODEL", "gpt-5-thinking")
	cfg2 := Load(log.New(os.Stderr, "test ", 0))
	if cfg2.OpenAIModel != "gpt-5-thinking" {
		t.Fatalf("expected OpenAIModel from HEXAI_OPENAI_MODEL to win, got %q", cfg2.OpenAIModel)
	}
}

// Test that HEXAI_MODEL_FORCE overrides provider-specific envs (used by CLI --model).
func TestEnv_ModelForce_OverridesProviderSpecific(t *testing.T) {
	t.Setenv("HEXAI_OPENAI_MODEL", "gpt-5-main")
	t.Setenv("HEXAI_MODEL_FORCE", "gpt-5-codex")
	t.Setenv("HEXAI_PROVIDER", "openai")
	cfg := Load(log.New(os.Stderr, "test ", 0))
	if cfg.OpenAIModel != "gpt-5-codex" {
		t.Fatalf("expected OpenAIModel forced to gpt-5-codex, got %q", cfg.OpenAIModel)
	}
}

func TestEnv_SurfaceModelOverrides(t *testing.T) {
	t.Setenv("HEXAI_MODEL_COMPLETION", "claude-c")
	t.Setenv("HEXAI_TEMPERATURE_COMPLETION", "0.44")
	t.Setenv("HEXAI_PROVIDER_COMPLETION", "anthropic")
	t.Setenv("HEXAI_MODEL_CLI", "gpt-cli")
	t.Setenv("HEXAI_TEMPERATURE_CLI", "0.22")
	t.Setenv("HEXAI_PROVIDER_CLI", "ollama")
	cfg := Load(log.New(os.Stderr, "test ", 0))
	if len(cfg.CompletionConfigs) != 1 {
		t.Fatalf("expected single completion entry, got %+v", cfg.CompletionConfigs)
	}
	comp := cfg.CompletionConfigs[0]
	if comp.Model != "claude-c" {
		t.Fatalf("expected completion model override, got %+v", comp)
	}
	if comp.Temperature == nil || *comp.Temperature != 0.44 {
		t.Fatalf("expected completion temperature override, got %+v", comp)
	}
	if comp.Provider != "anthropic" {
		t.Fatalf("expected completion provider override, got %+v", comp)
	}
	if len(cfg.CLIConfigs) != 1 {
		t.Fatalf("expected single CLI entry, got %+v", cfg.CLIConfigs)
	}
	cli := cfg.CLIConfigs[0]
	if cli.Model != "gpt-cli" {
		t.Fatalf("expected cli model override, got %+v", cli)
	}
	if cli.Temperature == nil || *cli.Temperature != 0.22 {
		t.Fatalf("expected cli temperature override, got %+v", cli)
	}
	if cli.Provider != "ollama" {
		t.Fatalf("expected cli provider override, got %+v", cli)
	}
}