package hexaiaction import ( "context" "strings" "testing" "codeberg.org/snonux/hexai/internal/appconfig" "codeberg.org/snonux/hexai/internal/llm" ) type simpleDoer struct{ s string } func (d simpleDoer) Chat(_ context.Context, _ []llm.Message, _ ...llm.RequestOption) (string, error) { return d.s, nil } func (d simpleDoer) DefaultModel() string { return "m" } func ptrFloat(v float64) *float64 { x := v return &x } func TestRunOnce_StripsFences(t *testing.T) { got, err := runOnce(context.Background(), simpleDoer{"```\nok\n```"}, "SYS", "USER") if err != nil { t.Fatalf("runOnce: %v", err) } if strings.TrimSpace(got) != "ok" { t.Fatalf("got %q", got) } } func TestReqOptsFrom_Override(t *testing.T) { cfg := appconfig.App{ CoreConfig: appconfig.CoreConfig{ MaxTokens: 123, Provider: "openai", }, ProviderConfig: appconfig.ProviderConfig{ AnthropicModel: "claude-3-5-sonnet", CodeActionConfigs: []appconfig.SurfaceConfig{{Provider: "anthropic", Model: "override", Temperature: ptrFloat(0.6)}}, }, } req := reqOptsFrom(&cfg) if req.model != "override" { t.Fatalf("expected override model, got %q", req.model) } var opts llm.Options for _, o := range req.options { o(&opts) } if opts.MaxTokens != 123 || opts.Model != "override" || opts.Temperature != 0.6 { t.Fatalf("unexpected options: %+v", opts) } } func TestReqOptsFrom_Gpt5Temp(t *testing.T) { cfg := appconfig.App{ CoreConfig: appconfig.CoreConfig{ Provider: "openai", CodingTemperature: ptrFloat(0.2), }, ProviderConfig: appconfig.ProviderConfig{OpenAIModel: "gpt-5.0"}, } req := reqOptsFrom(&cfg) var opts llm.Options for _, o := range req.options { o(&opts) } if opts.Temperature != 1.0 { t.Fatalf("expected gpt-5 temp adjustment to 1.0, got %v", opts.Temperature) } }