chore: update default model to gpt-5.4, codex to gpt-5.3-codex

Update OpenAI default model references from gpt-5.2 to gpt-5.4
across source code, config examples, tests, and docs. Set Codex
default model to gpt-5.3-codex.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Guoguo 2026-03-12 00:38:07 -07:00
parent 4b1460fa3f
commit b14d4b6b97
17 changed files with 66 additions and 60 deletions

View file

@ -49,7 +49,7 @@ func (s *appState) modelMenu() tview.Primitive {
Action: func() { Action: func() {
newName := s.nextAvailableModelName("new-model") newName := s.nextAvailableModelName("new-model")
s.addModel( s.addModel(
picoclawconfig.ModelConfig{ModelName: newName, Model: "openai/gpt-5.2"}, picoclawconfig.ModelConfig{ModelName: newName, Model: "openai/gpt-5.4"},
) )
s.push( s.push(
fmt.Sprintf("model-%d", len(s.config.ModelList)-1), fmt.Sprintf("model-%d", len(s.config.ModelList)-1),
@ -291,7 +291,7 @@ func refreshModelMenuFromState(menu *Menu, s *appState) {
Action: func() { Action: func() {
newName := s.nextAvailableModelName("new-model") newName := s.nextAvailableModelName("new-model")
s.addModel( s.addModel(
picoclawconfig.ModelConfig{ModelName: newName, Model: "openai/gpt-5.2"}, picoclawconfig.ModelConfig{ModelName: newName, Model: "openai/gpt-5.4"},
) )
s.push(fmt.Sprintf("model-%d", len(s.config.ModelList)-1), s.modelForm(len(s.config.ModelList)-1)) s.push(fmt.Sprintf("model-%d", len(s.config.ModelList)-1), s.modelForm(len(s.config.ModelList)-1))
}, },

View file

@ -72,14 +72,14 @@ func authLoginOpenAI(useDeviceCode bool) error {
// If no openai in ModelList, add it // If no openai in ModelList, add it
if !foundOpenAI { if !foundOpenAI {
appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{ appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{
ModelName: "gpt-5.2", ModelName: "gpt-5.4",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: "oauth", AuthMethod: "oauth",
}) })
} }
// Update default model to use OpenAI // Update default model to use OpenAI
appCfg.Agents.Defaults.ModelName = "gpt-5.2" appCfg.Agents.Defaults.ModelName = "gpt-5.4"
if err = config.SaveConfig(internal.GetConfigPath(), appCfg); err != nil { if err = config.SaveConfig(internal.GetConfigPath(), appCfg); err != nil {
return fmt.Errorf("could not update config: %w", err) return fmt.Errorf("could not update config: %w", err)
@ -90,7 +90,7 @@ func authLoginOpenAI(useDeviceCode bool) error {
if cred.AccountID != "" { if cred.AccountID != "" {
fmt.Printf("Account: %s\n", cred.AccountID) fmt.Printf("Account: %s\n", cred.AccountID)
} }
fmt.Println("Default model set to: gpt-5.2") fmt.Println("Default model set to: gpt-5.4")
return nil return nil
} }
@ -318,13 +318,13 @@ func authLoginPasteToken(provider string) error {
} }
if !found { if !found {
appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{ appCfg.ModelList = append(appCfg.ModelList, config.ModelConfig{
ModelName: "gpt-5.2", ModelName: "gpt-5.4",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: "token", AuthMethod: "token",
}) })
} }
// Update default model // Update default model
appCfg.Agents.Defaults.ModelName = "gpt-5.2" appCfg.Agents.Defaults.ModelName = "gpt-5.4"
} }
if err := config.SaveConfig(internal.GetConfigPath(), appCfg); err != nil { if err := config.SaveConfig(internal.GetConfigPath(), appCfg); err != nil {
return fmt.Errorf("could not update config: %w", err) return fmt.Errorf("could not update config: %w", err)

View file

@ -3,7 +3,7 @@
"defaults": { "defaults": {
"workspace": "~/.picoclaw/workspace", "workspace": "~/.picoclaw/workspace",
"restrict_to_workspace": true, "restrict_to_workspace": true,
"model_name": "gpt4", "model_name": "gpt-5.4",
"max_tokens": 8192, "max_tokens": 8192,
"temperature": 0.7, "temperature": 0.7,
"max_tool_iterations": 20, "max_tool_iterations": 20,
@ -13,8 +13,8 @@
}, },
"model_list": [ "model_list": [
{ {
"model_name": "gpt4", "model_name": "gpt-5.4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-your-openai-key", "api_key": "sk-your-openai-key",
"api_base": "https://api.openai.com/v1" "api_base": "https://api.openai.com/v1"
}, },
@ -41,14 +41,14 @@
"api_key": "your-longcat-api-key" "api_key": "your-longcat-api-key"
}, },
{ {
"model_name": "loadbalanced-gpt4", "model_name": "loadbalanced-gpt-5.4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-key1", "api_key": "sk-key1",
"api_base": "https://api1.example.com/v1" "api_base": "https://api1.example.com/v1"
}, },
{ {
"model_name": "loadbalanced-gpt4", "model_name": "loadbalanced-gpt-5.4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-key2", "api_key": "sk-key2",
"api_base": "https://api2.example.com/v1" "api_base": "https://api2.example.com/v1"
} }

View file

@ -66,7 +66,7 @@ Problem: Agent needs to know both `provider` and `model`, adding complexity.
Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design: Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design:
1. **Model-centric**: Users care about models, not providers 1. **Model-centric**: Users care about models, not providers
2. **Protocol prefix**: Use `protocol/model_name` format, e.g., `openai/gpt-5.2`, `anthropic/claude-sonnet-4.6` 2. **Protocol prefix**: Use `protocol/model_name` format, e.g., `openai/gpt-5.4`, `anthropic/claude-sonnet-4.6`
3. **Configuration-driven**: Adding new Providers only requires config changes, no code changes 3. **Configuration-driven**: Adding new Providers only requires config changes, no code changes
### 2.2 New Configuration Structure ### 2.2 New Configuration Structure
@ -81,8 +81,8 @@ Inspired by [LiteLLM](https://docs.litellm.ai/docs/proxy/configs) design:
"api_key": "sk-xxx" "api_key": "sk-xxx"
}, },
{ {
"model_name": "gpt-5.2", "model_name": "gpt-5.4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-xxx" "api_key": "sk-xxx"
}, },
{ {
@ -128,7 +128,7 @@ type Config struct {
type ModelConfig struct { type ModelConfig struct {
// Required // Required
ModelName string `json:"model_name"` // user-facing name (alias) ModelName string `json:"model_name"` // user-facing name (alias)
Model string `json:"model"` // protocol/model, e.g., openai/gpt-5.2 Model string `json:"model"` // protocol/model, e.g., openai/gpt-5.4
// Common config // Common config
APIBase string `json:"api_base,omitempty"` APIBase string `json:"api_base,omitempty"`
@ -180,7 +180,7 @@ Identify protocol via prefix in `model` field:
"model": "deepseek-chat" "model": "deepseek-chat"
}, },
"coder": { "coder": {
"model": "gpt-5.2", "model": "gpt-5.4",
"system_prompt": "You are a coding assistant..." "system_prompt": "You are a coding assistant..."
}, },
"translator": { "translator": {
@ -200,7 +200,7 @@ Each Agent only needs to specify `model` (corresponds to `model_name` in `model_
model_list: model_list:
- model_name: gpt-4o - model_name: gpt-4o
litellm_params: litellm_params:
model: openai/gpt-5.2 model: openai/gpt-5.4
api_key: xxx api_key: xxx
- model_name: my-custom - model_name: my-custom
litellm_params: litellm_params:

View file

@ -40,7 +40,7 @@ The new `model_list` configuration offers several advantages:
"agents": { "agents": {
"defaults": { "defaults": {
"provider": "openai", "provider": "openai",
"model": "gpt-5.2" "model": "gpt-5.4"
} }
} }
} }
@ -53,7 +53,7 @@ The new `model_list` configuration offers several advantages:
"model_list": [ "model_list": [
{ {
"model_name": "gpt4", "model_name": "gpt4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-your-openai-key", "api_key": "sk-your-openai-key",
"api_base": "https://api.openai.com/v1" "api_base": "https://api.openai.com/v1"
}, },
@ -82,7 +82,7 @@ The `model` field uses a protocol prefix format: `[protocol/]model-identifier`
| Prefix | Description | Example | | Prefix | Description | Example |
|--------|-------------|---------| |--------|-------------|---------|
| `openai/` | OpenAI API (default) | `openai/gpt-5.2` | | `openai/` | OpenAI API (default) | `openai/gpt-5.4` |
| `anthropic/` | Anthropic API | `anthropic/claude-opus-4` | | `anthropic/` | Anthropic API | `anthropic/claude-opus-4` |
| `antigravity/` | Google via Antigravity OAuth | `antigravity/gemini-2.0-flash` | | `antigravity/` | Google via Antigravity OAuth | `antigravity/gemini-2.0-flash` |
| `gemini/` | Google Gemini API | `gemini/gemini-2.0-flash-exp` | | `gemini/` | Google Gemini API | `gemini/gemini-2.0-flash-exp` |
@ -109,7 +109,7 @@ The `model` field uses a protocol prefix format: `[protocol/]model-identifier`
| Field | Required | Description | | Field | Required | Description |
|-------|----------|-------------| |-------|----------|-------------|
| `model_name` | Yes | User-facing alias for the model | | `model_name` | Yes | User-facing alias for the model |
| `model` | Yes | Protocol and model identifier (e.g., `openai/gpt-5.2`) | | `model` | Yes | Protocol and model identifier (e.g., `openai/gpt-5.4`) |
| `api_base` | No | API endpoint URL | | `api_base` | No | API endpoint URL |
| `api_key` | No* | API authentication key | | `api_key` | No* | API authentication key |
| `proxy` | No | HTTP proxy URL | | `proxy` | No | HTTP proxy URL |
@ -130,19 +130,19 @@ Configure multiple endpoints for the same model to distribute load:
"model_list": [ "model_list": [
{ {
"model_name": "gpt4", "model_name": "gpt4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-key1", "api_key": "sk-key1",
"api_base": "https://api1.example.com/v1" "api_base": "https://api1.example.com/v1"
}, },
{ {
"model_name": "gpt4", "model_name": "gpt4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-key2", "api_key": "sk-key2",
"api_base": "https://api2.example.com/v1" "api_base": "https://api2.example.com/v1"
}, },
{ {
"model_name": "gpt4", "model_name": "gpt4",
"model": "openai/gpt-5.2", "model": "openai/gpt-5.4",
"api_key": "sk-key3", "api_key": "sk-key3",
"api_base": "https://api3.example.com/v1" "api_base": "https://api3.example.com/v1"
} }

View file

@ -444,7 +444,7 @@ func TestLoadConfig_WebToolsProxy(t *testing.T) {
configPath := filepath.Join(tmpDir, "config.json") configPath := filepath.Join(tmpDir, "config.json")
configJSON := `{ configJSON := `{
"agents": {"defaults":{"workspace":"./workspace","model":"gpt4","max_tokens":8192,"max_tool_iterations":20}}, "agents": {"defaults":{"workspace":"./workspace","model":"gpt4","max_tokens":8192,"max_tool_iterations":20}},
"model_list": [{"model_name":"gpt4","model":"openai/gpt-5.2","api_key":"x"}], "model_list": [{"model_name":"gpt4","model":"openai/gpt-5.4","api_key":"x"}],
"tools": {"web":{"proxy":"http://127.0.0.1:7890"}} "tools": {"web":{"proxy":"http://127.0.0.1:7890"}}
}` }`
if err := os.WriteFile(configPath, []byte(configJSON), 0o600); err != nil { if err := os.WriteFile(configPath, []byte(configJSON), 0o600); err != nil {

View file

@ -194,8 +194,8 @@ func DefaultConfig() *Config {
// OpenAI - https://platform.openai.com/api-keys // OpenAI - https://platform.openai.com/api-keys
{ {
ModelName: "gpt-5.2", ModelName: "gpt-5.4",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
APIBase: "https://api.openai.com/v1", APIBase: "https://api.openai.com/v1",
APIKey: "", APIKey: "",
}, },
@ -256,8 +256,8 @@ func DefaultConfig() *Config {
APIKey: "", APIKey: "",
}, },
{ {
ModelName: "openrouter-gpt-5.2", ModelName: "openrouter-gpt-5.4",
Model: "openrouter/openai/gpt-5.2", Model: "openrouter/openai/gpt-5.4",
APIBase: "https://openrouter.ai/api/v1", APIBase: "https://openrouter.ai/api/v1",
APIKey: "", APIKey: "",
}, },
@ -287,6 +287,12 @@ func DefaultConfig() *Config {
}, },
// Volcengine (火山引擎) - https://console.volcengine.com/ark // Volcengine (火山引擎) - https://console.volcengine.com/ark
{
ModelName: "ark-code-latest",
Model: "volcengine/ark-code-latest",
APIBase: "https://ark.cn-beijing.volces.com/api/v3",
APIKey: "",
},
{ {
ModelName: "doubao-pro", ModelName: "doubao-pro",
Model: "volcengine/doubao-pro-32k", Model: "volcengine/doubao-pro-32k",
@ -311,8 +317,8 @@ func DefaultConfig() *Config {
// GitHub Copilot - https://github.com/settings/tokens // GitHub Copilot - https://github.com/settings/tokens
{ {
ModelName: "copilot-gpt-5.2", ModelName: "copilot-gpt-5.4",
Model: "github-copilot/gpt-5.2", Model: "github-copilot/gpt-5.4",
APIBase: "http://localhost:4321", APIBase: "http://localhost:4321",
AuthMethod: "oauth", AuthMethod: "oauth",
}, },

View file

@ -61,7 +61,7 @@ func ConvertProvidersToModelList(cfg *Config) []ModelConfig {
} }
return ModelConfig{ return ModelConfig{
ModelName: "openai", ModelName: "openai",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
APIKey: p.OpenAI.APIKey, APIKey: p.OpenAI.APIKey,
APIBase: p.OpenAI.APIBase, APIBase: p.OpenAI.APIBase,
Proxy: p.OpenAI.Proxy, Proxy: p.OpenAI.Proxy,
@ -335,7 +335,7 @@ func ConvertProvidersToModelList(cfg *Config) []ModelConfig {
} }
return ModelConfig{ return ModelConfig{
ModelName: "github-copilot", ModelName: "github-copilot",
Model: "github-copilot/gpt-5.2", Model: "github-copilot/gpt-5.4",
APIBase: p.GitHubCopilot.APIBase, APIBase: p.GitHubCopilot.APIBase,
ConnectMode: p.GitHubCopilot.ConnectMode, ConnectMode: p.GitHubCopilot.ConnectMode,
}, true }, true

View file

@ -31,8 +31,8 @@ func TestConvertProvidersToModelList_OpenAI(t *testing.T) {
if result[0].ModelName != "openai" { if result[0].ModelName != "openai" {
t.Errorf("ModelName = %q, want %q", result[0].ModelName, "openai") t.Errorf("ModelName = %q, want %q", result[0].ModelName, "openai")
} }
if result[0].Model != "openai/gpt-5.2" { if result[0].Model != "openai/gpt-5.4" {
t.Errorf("Model = %q, want %q", result[0].Model, "openai/gpt-5.2") t.Errorf("Model = %q, want %q", result[0].Model, "openai/gpt-5.4")
} }
if result[0].APIKey != "sk-test-key" { if result[0].APIKey != "sk-test-key" {
t.Errorf("APIKey = %q, want %q", result[0].APIKey, "sk-test-key") t.Errorf("APIKey = %q, want %q", result[0].APIKey, "sk-test-key")
@ -384,8 +384,8 @@ func TestConvertProvidersToModelList_MultipleProviders_PreservesUserModel(t *tes
for _, mc := range result { for _, mc := range result {
switch mc.ModelName { switch mc.ModelName {
case "openai": case "openai":
if mc.Model != "openai/gpt-5.2" { if mc.Model != "openai/gpt-5.4" {
t.Errorf("OpenAI Model = %q, want %q (default)", mc.Model, "openai/gpt-5.2") t.Errorf("OpenAI Model = %q, want %q (default)", mc.Model, "openai/gpt-5.4")
} }
case "deepseek": case "deepseek":
if mc.Model != "deepseek/deepseek-reasoner" { if mc.Model != "deepseek/deepseek-reasoner" {
@ -558,9 +558,9 @@ func TestConvertProvidersToModelList_NoProviderField_NoModel(t *testing.T) {
// Tests for buildModelWithProtocol helper function // Tests for buildModelWithProtocol helper function
func TestBuildModelWithProtocol_NoPrefix(t *testing.T) { func TestBuildModelWithProtocol_NoPrefix(t *testing.T) {
result := buildModelWithProtocol("openai", "gpt-5.2") result := buildModelWithProtocol("openai", "gpt-5.4")
if result != "openai/gpt-5.2" { if result != "openai/gpt-5.4" {
t.Errorf("buildModelWithProtocol(openai, gpt-5.2) = %q, want %q", result, "openai/gpt-5.2") t.Errorf("buildModelWithProtocol(openai, gpt-5.4) = %q, want %q", result, "openai/gpt-5.4")
} }
} }

View file

@ -490,7 +490,7 @@ echo '{"type":"turn.completed"}'`
} }
messages := []Message{{Role: "user", Content: "test"}} messages := []Message{{Role: "user", Content: "test"}}
_, err := p.Chat(context.Background(), messages, nil, "gpt-5.2-codex", nil) _, err := p.Chat(context.Background(), messages, nil, "gpt-5.3-codex", nil)
if err != nil { if err != nil {
t.Fatalf("Chat() error: %v", err) t.Fatalf("Chat() error: %v", err)
} }
@ -502,7 +502,7 @@ echo '{"type":"turn.completed"}'`
} }
args := string(argsData) args := string(argsData)
if !strings.Contains(args, "-m gpt-5.2-codex") { if !strings.Contains(args, "-m gpt-5.3-codex") {
t.Errorf("args should contain model flag, got: %s", args) t.Errorf("args should contain model flag, got: %s", args)
} }
if !strings.Contains(args, "-C /tmp/test-workspace") { if !strings.Contains(args, "-C /tmp/test-workspace") {

View file

@ -16,7 +16,7 @@ import (
) )
const ( const (
codexDefaultModel = "gpt-5.2" codexDefaultModel = "gpt-5.3-codex"
codexDefaultInstructions = "You are Codex, a coding assistant." codexDefaultInstructions = "You are Codex, a coding assistant."
) )

View file

@ -568,7 +568,7 @@ func TestCodexProvider_ChatRoundTrip_ModelFallbackFromUnsupported(t *testing.T)
provider.client = createOpenAITestClient(server.URL, "test-token", "acc-123") provider.client = createOpenAITestClient(server.URL, "test-token", "acc-123")
messages := []Message{{Role: "user", Content: "Hello"}} messages := []Message{{Role: "user", Content: "Hello"}}
resp, err := provider.Chat(t.Context(), messages, nil, "gpt-5.2", nil) resp, err := provider.Chat(t.Context(), messages, nil, "gpt-5.3-codex", nil)
if err != nil { if err != nil {
t.Fatalf("Chat() error: %v", err) t.Fatalf("Chat() error: %v", err)
} }
@ -599,7 +599,7 @@ func TestResolveCodexModel(t *testing.T) {
wantFallback: true, wantFallback: true,
}, },
{name: "non-openai prefixed", input: "glm-4.7", wantModel: codexDefaultModel, wantFallback: true}, {name: "non-openai prefixed", input: "glm-4.7", wantModel: codexDefaultModel, wantFallback: true},
{name: "openai prefix", input: "openai/gpt-5.2", wantModel: "gpt-5.2", wantFallback: false}, {name: "openai prefix", input: "openai/gpt-5.3-codex", wantModel: "gpt-5.3-codex", wantFallback: false},
{name: "direct gpt", input: "gpt-4o", wantModel: "gpt-4o", wantFallback: false}, {name: "direct gpt", input: "gpt-4o", wantModel: "gpt-4o", wantFallback: false},
} }

View file

@ -247,7 +247,7 @@ func TestGatewayStartReady_OAuthModelRequiresStoredCredential(t *testing.T) {
} }
cfg.ModelList = []config.ModelConfig{{ cfg.ModelList = []config.ModelConfig{{
ModelName: "openai-oauth", ModelName: "openai-oauth",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: "oauth", AuthMethod: "oauth",
}} }}
cfg.Agents.Defaults.ModelName = "openai-oauth" cfg.Agents.Defaults.ModelName = "openai-oauth"

View file

@ -62,7 +62,7 @@ func TestHandleListModels_ConfiguredStatusUsesRuntimeProbesForLocalModels(t *tes
cfg.ModelList = []config.ModelConfig{ cfg.ModelList = []config.ModelConfig{
{ {
ModelName: "openai-oauth", ModelName: "openai-oauth",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: "oauth", AuthMethod: "oauth",
}, },
{ {
@ -81,8 +81,8 @@ func TestHandleListModels_ConfiguredStatusUsesRuntimeProbesForLocalModels(t *tes
APIKey: "remote-key", APIKey: "remote-key",
}, },
{ {
ModelName: "copilot-gpt-5.2", ModelName: "copilot-gpt-5.4",
Model: "github-copilot/gpt-5.2", Model: "github-copilot/gpt-5.4",
APIBase: "http://127.0.0.1:4321", APIBase: "http://127.0.0.1:4321",
AuthMethod: "oauth", AuthMethod: "oauth",
}, },
@ -128,7 +128,7 @@ func TestHandleListModels_ConfiguredStatusUsesRuntimeProbesForLocalModels(t *tes
if !got["vllm-remote"] { if !got["vllm-remote"] {
t.Fatalf("remote vllm model configured = false, want true with api_key") t.Fatalf("remote vllm model configured = false, want true with api_key")
} }
if !got["copilot-gpt-5.2"] { if !got["copilot-gpt-5.4"] {
t.Fatalf("copilot model configured = false, want true when local bridge probe succeeds") t.Fatalf("copilot model configured = false, want true when local bridge probe succeeds")
} }
if len(openAIProbes) != 1 || openAIProbes[0] != "http://127.0.0.1:8000/v1|custom-model" { if len(openAIProbes) != 1 || openAIProbes[0] != "http://127.0.0.1:8000/v1|custom-model" {

View file

@ -791,8 +791,8 @@ func defaultModelConfigForProvider(provider, authMethod string) config.ModelConf
switch provider { switch provider {
case oauthProviderOpenAI: case oauthProviderOpenAI:
return config.ModelConfig{ return config.ModelConfig{
ModelName: "gpt-5.2", ModelName: "gpt-5.4",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: authMethod, AuthMethod: authMethod,
} }
case oauthProviderAnthropic: case oauthProviderAnthropic:

View file

@ -168,8 +168,8 @@ func TestOAuthLogoutClearsCredentialAndConfig(t *testing.T) {
} }
cfg.Providers.OpenAI.AuthMethod = "oauth" cfg.Providers.OpenAI.AuthMethod = "oauth"
cfg.ModelList = append(cfg.ModelList, config.ModelConfig{ cfg.ModelList = append(cfg.ModelList, config.ModelConfig{
ModelName: "gpt-5.2", ModelName: "gpt-5.4",
Model: "openai/gpt-5.2", Model: "openai/gpt-5.4",
AuthMethod: "oauth", AuthMethod: "oauth",
}) })
if err = config.SaveConfig(configPath, cfg); err != nil { if err = config.SaveConfig(configPath, cfg); err != nil {

View file

@ -59,7 +59,7 @@ Default model is `google/gemini-3-flash-preview` if none is set.
Optional config file: `~/.summarize/config.json` Optional config file: `~/.summarize/config.json`
```json ```json
{ "model": "openai/gpt-5.2" } { "model": "openai/gpt-5.4" }
``` ```
Optional services: Optional services: