diff --git a/AGENTS.md b/AGENTS.md index cac369f..5bcc5e6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -38,8 +38,8 @@ go test ./internal/domain/categorizer/... -v # single package Reads `config.yaml` or env vars: - `MONARCH_TOKEN` — Monarch API token (required) - LLM categorizer — set **one** of: - - `OPENAI_API_KEY` (also `OPENAI_APIKEY`) with optional `OPENAI_MODEL` (default `gpt-5.4-nano`) - - `ANTHROPIC_API_KEY` (also `CLAUDE_API_KEY`) with optional `ANTHROPIC_MODEL` (default `claude-haiku-4-5-20251001`) + - `OPENAI_API_KEY` (also `OPENAI_APIKEY`) with optional `OPENAI_MODEL` (default `gpt-5.6-luna`) + - `ANTHROPIC_API_KEY` (also `CLAUDE_API_KEY`) with optional `ANTHROPIC_MODEL` (default `claude-haiku-4-5`) - `CATEGORIZER_PROVIDER` — `openai` or `anthropic` to force a backend when both keys are set (auto-detected otherwise) - SQLite DB auto-created at `monarch_sync.db` diff --git a/README.md b/README.md index 2a17520..11a8ec5 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,11 @@ monarch: openai: api_key: "${OPENAI_API_KEY}" - model: "gpt-5.4-nano" + model: "gpt-5.6-luna" anthropic: api_key: "${ANTHROPIC_API_KEY}" - model: "claude-haiku-4-5-20251001" + model: "claude-haiku-4-5" # Optional: force a backend when both keys are set. # Leave blank to auto-detect from whichever key is present. diff --git a/config.yaml b/config.yaml index e8fc38b..e575e46 100644 --- a/config.yaml +++ b/config.yaml @@ -36,13 +36,13 @@ monarch: # OpenAI configuration openai: api_key: "${OPENAI_API_KEY}" - model: "gpt-5.4-nano" + model: "gpt-5.6-luna" # Anthropic (Claude) configuration — used when CATEGORIZER_PROVIDER=anthropic # or when ANTHROPIC_API_KEY is the only LLM key set. anthropic: api_key: "${ANTHROPIC_API_KEY}" - model: "claude-haiku-4-5-20251001" + model: "claude-haiku-4-5" # Categorizer backend selection. # Leave provider empty to auto-detect from which API key is set. diff --git a/internal/adapters/clients/clients.go b/internal/adapters/clients/clients.go index 9f1df0b..c5fb447 100644 --- a/internal/adapters/clients/clients.go +++ b/internal/adapters/clients/clients.go @@ -5,17 +5,17 @@ import ( "log/slog" "strings" - "github.com/eshaffer321/monarch-go/v2/pkg/monarch" anthropicclient "github.com/eshaffer321/itemize/internal/adapters/clients/anthropic" openaiclient "github.com/eshaffer321/itemize/internal/adapters/clients/openai" "github.com/eshaffer321/itemize/internal/domain/categorizer" "github.com/eshaffer321/itemize/internal/infrastructure/config" + "github.com/eshaffer321/monarch-go/v2/pkg/monarch" ) const ( providerOpenAI = "openai" providerAnthropic = "anthropic" - defaultAnthropicModel = "claude-haiku-4-5-20251001" + defaultAnthropicModel = "claude-haiku-4-5" ) type Clients struct { diff --git a/internal/domain/categorizer/categorizer.go b/internal/domain/categorizer/categorizer.go index cd10cd7..7be7283 100644 --- a/internal/domain/categorizer/categorizer.go +++ b/internal/domain/categorizer/categorizer.go @@ -96,7 +96,7 @@ func NewCategorizer(client ChatClient, cache Cache, model string) *Categorizer { } } -const DefaultModel = "gpt-5.4-nano" +const DefaultModel = "gpt-5.6-luna" // CategorizeItems categorizes a list of items using available categories func (c *Categorizer) CategorizeItems(ctx context.Context, items []Item, categories []Category) (*CategorizationResult, error) { diff --git a/internal/domain/categorizer/categorizer_test.go b/internal/domain/categorizer/categorizer_test.go index b0104ce..bd6476f 100644 --- a/internal/domain/categorizer/categorizer_test.go +++ b/internal/domain/categorizer/categorizer_test.go @@ -423,5 +423,5 @@ func TestCategorizer_CategorizeItems_ExhaustsRetries(t *testing.T) { func TestNewCategorizer_DefaultsModelWhenEmpty(t *testing.T) { categorizer := NewCategorizer(new(MockChatClient), new(MockCache), "") - assert.Equal(t, "gpt-5.4-nano", categorizer.Model) + assert.Equal(t, DefaultModel, categorizer.Model) } diff --git a/internal/infrastructure/config/config.go b/internal/infrastructure/config/config.go index 611cbb7..cd530a7 100644 --- a/internal/infrastructure/config/config.go +++ b/internal/infrastructure/config/config.go @@ -186,11 +186,11 @@ func LoadFromEnv() *Config { }, OpenAI: OpenAIConfig{ APIKey: os.Getenv("OPENAI_API_KEY"), - Model: getEnv("OPENAI_MODEL", "gpt-5.4-nano"), + Model: getEnv("OPENAI_MODEL", "gpt-5.6-luna"), }, Anthropic: AnthropicConfig{ APIKey: firstNonEmpty(os.Getenv("ANTHROPIC_API_KEY"), os.Getenv("CLAUDE_API_KEY")), - Model: getEnv("ANTHROPIC_MODEL", "claude-haiku-4-5-20251001"), + Model: getEnv("ANTHROPIC_MODEL", "claude-haiku-4-5"), }, Categorizer: CategorizerConfig{ Provider: os.Getenv("CATEGORIZER_PROVIDER"), diff --git a/internal/infrastructure/config/config_test.go b/internal/infrastructure/config/config_test.go index 962e1ad..42c7d78 100644 --- a/internal/infrastructure/config/config_test.go +++ b/internal/infrastructure/config/config_test.go @@ -37,7 +37,7 @@ func TestLoadFromYAML(t *testing.T) { require.NoError(t, err) assert.NotNil(t, cfg) assert.Equal(t, "monarch_sync.db", cfg.Storage.DatabasePath) - assert.Equal(t, "gpt-5.4-nano", cfg.OpenAI.Model) + assert.Equal(t, "gpt-5.6-luna", cfg.OpenAI.Model) } func TestLoadFromEnv(t *testing.T) { @@ -66,7 +66,7 @@ func TestLoadFromEnv_Defaults(t *testing.T) { cfg := LoadFromEnv() assert.NotNil(t, cfg) assert.Equal(t, "monarch_sync.db", cfg.Storage.DatabasePath) - assert.Equal(t, "gpt-5.4-nano", cfg.OpenAI.Model) + assert.Equal(t, "gpt-5.6-luna", cfg.OpenAI.Model) } func TestLoadOrEnv(t *testing.T) {