docs: update glm references to glm-5.2

Update glm-5.1 references to glm-5.2. Also update the context size for the new model
This commit is contained in:
Bruce MacDonald
2026-06-22 12:59:00 -07:00
parent e434a93884
commit 5b7635b933
12 changed files with 48 additions and 48 deletions

View File

@@ -327,7 +327,7 @@ func TestParseArgs(t *testing.T) {
func TestIsCloudModel(t *testing.T) {
// isCloudModel now only uses Show API, so nil client always returns false
t.Run("nil client returns false", func(t *testing.T) {
models := []string{"glm-5.1:cloud", "kimi-k2.6:cloud", "local-model"}
models := []string{"glm-5.2:cloud", "kimi-k2.6:cloud", "local-model"}
for _, model := range models {
if isCloudModel(context.Background(), nil, model) {
t.Errorf("isCloudModel(%q) with nil client should return false", model)
@@ -393,7 +393,7 @@ func TestBuildModelList_OnlyLocalModels_CloudRecsStillFirst(t *testing.T) {
func TestBuildModelList_BothCloudAndLocal_RegularSort(t *testing.T) {
existing := []modelInfo{
{Name: "llama3.2:latest", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, nil, "")
@@ -409,7 +409,7 @@ func TestBuildModelList_BothCloudAndLocal_RegularSort(t *testing.T) {
func TestBuildModelList_PreCheckedNonRecommendedFirstInMore(t *testing.T) {
existing := []modelInfo{
{Name: "llama3.2:latest", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, []string{"llama3.2"}, "")
@@ -457,14 +457,14 @@ func TestBuildModelList_CurrentDefaultFirstAmongCheckedNonRec(t *testing.T) {
func TestBuildModelList_ExistingRecommendedMarked(t *testing.T) {
existing := []modelInfo{
{Name: "gemma4", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, nil, "")
for _, item := range items {
switch item.Name {
case "gemma4", "glm-5.1:cloud":
case "gemma4", "glm-5.2:cloud":
if strings.HasSuffix(item.Description, "(not downloaded)") {
t.Errorf("installed recommended %q should not have '(not downloaded)' suffix, got %q", item.Name, item.Description)
}
@@ -505,13 +505,13 @@ func TestBuildModelList_PreservesRecommendationRequiredPlanForExistingCloudModel
func TestBuildModelList_ExistingCloudModelsNotPushedToBottom(t *testing.T) {
existing := []modelInfo{
{Name: "gemma4", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, nil, "")
got := names(items)
// gemma4 and glm-5.1:cloud are installed so they sort normally;
// gemma4 and glm-5.2:cloud are installed so they sort normally;
// qwen3.5:cloud and qwen3.5 are not installed so they go to the bottom
// All recs: cloud first in mixed case, then local, in rec order within each
want := recommendedNames()
@@ -588,7 +588,7 @@ func TestBuildModelList_LatestTagStripped(t *testing.T) {
func TestBuildModelList_ReturnsExistingAndCloudMaps(t *testing.T) {
existing := []modelInfo{
{Name: "llama3.2:latest", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
_, _, existingModels, cloudModels := buildModelList(existing, nil, "")
@@ -596,15 +596,15 @@ func TestBuildModelList_ReturnsExistingAndCloudMaps(t *testing.T) {
if !existingModels["llama3.2"] {
t.Error("llama3.2 should be in existingModels")
}
if !existingModels["glm-5.1:cloud"] {
t.Error("glm-5.1:cloud should be in existingModels")
if !existingModels["glm-5.2:cloud"] {
t.Error("glm-5.2:cloud should be in existingModels")
}
if existingModels["gemma4"] {
t.Error("gemma4 should not be in existingModels (it's a recommendation)")
}
if !cloudModels["glm-5.1:cloud"] {
t.Error("glm-5.1:cloud should be in cloudModels")
if !cloudModels["glm-5.2:cloud"] {
t.Error("glm-5.2:cloud should be in cloudModels")
}
if !cloudModels["kimi-k2.6:cloud"] {
t.Error("kimi-k2.6:cloud should be in cloudModels (recommended cloud)")
@@ -627,7 +627,7 @@ func TestBuildModelList_RecommendedFieldSet(t *testing.T) {
for _, item := range items {
switch item.Name {
case "gemma4", "qwen3.5", "glm-5.1:cloud", "kimi-k2.6:cloud", "qwen3.5:cloud":
case "gemma4", "qwen3.5", "glm-5.2:cloud", "kimi-k2.6:cloud", "qwen3.5:cloud":
if !item.Recommended {
t.Errorf("%q should have Recommended=true", item.Name)
}
@@ -642,14 +642,14 @@ func TestBuildModelList_RecommendedFieldSet(t *testing.T) {
func TestBuildModelList_MixedCase_CloudRecsFirst(t *testing.T) {
existing := []modelInfo{
{Name: "llama3.2:latest", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, nil, "")
got := names(items)
// Cloud recs should sort before local recs in mixed case
cloudIdx := slices.Index(got, "glm-5.1:cloud")
cloudIdx := slices.Index(got, "glm-5.2:cloud")
localIdx := slices.Index(got, "gemma4")
if cloudIdx > localIdx {
t.Errorf("cloud recs should be before local recs in mixed case, got %v", got)
@@ -666,7 +666,7 @@ func TestBuildModelList_OnlyLocal_CloudRecsStillFirst(t *testing.T) {
// Cloud recs sort before local recs regardless of installed inventory.
localIdx := slices.Index(got, "gemma4")
cloudIdx := slices.Index(got, "glm-5.1:cloud")
cloudIdx := slices.Index(got, "glm-5.2:cloud")
if cloudIdx > localIdx {
t.Errorf("cloud recs should be before local recs even when only local models installed, got %v", got)
}
@@ -685,7 +685,7 @@ func TestBuildModelList_RecsAboveNonRecs(t *testing.T) {
lastRecIdx := -1
firstNonRecIdx := len(got)
for i, name := range got {
isRec := name == "gemma4" || name == "qwen3.5" || name == "minimax-m2.7:cloud" || name == "glm-5.1:cloud" || name == "kimi-k2.6:cloud" || name == "qwen3.5:cloud"
isRec := name == "gemma4" || name == "qwen3.5" || name == "minimax-m2.7:cloud" || name == "glm-5.2:cloud" || name == "kimi-k2.6:cloud" || name == "qwen3.5:cloud"
if isRec && i > lastRecIdx {
lastRecIdx = i
}
@@ -701,10 +701,10 @@ func TestBuildModelList_RecsAboveNonRecs(t *testing.T) {
func TestBuildModelList_CheckedRecommendedDoesNotReshuffleRecommendedOrder(t *testing.T) {
existing := []modelInfo{
{Name: "llama3.2:latest", Remote: false},
{Name: "glm-5.1:cloud", Remote: true},
{Name: "glm-5.2:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, []string{"qwen3.5:cloud", "glm-5.1:cloud"}, "")
items, _, _, _ := buildModelList(existing, []string{"qwen3.5:cloud", "glm-5.2:cloud"}, "")
got := names(items)
want := recommendedNames("llama3.2")
@@ -718,7 +718,7 @@ func TestBuildModelList_StaleSavedKimiK25DoesNotReshuffleRecommendedOrder(t *tes
{Name: "kimi-k2.5:cloud", Remote: true},
}
items, _, _, _ := buildModelList(existing, []string{"kimi-k2.5:cloud", "qwen3.5:cloud", "glm-5.1:cloud", "minimax-m2.7:cloud"}, "kimi-k2.5:cloud")
items, _, _, _ := buildModelList(existing, []string{"kimi-k2.5:cloud", "qwen3.5:cloud", "glm-5.2:cloud", "minimax-m2.7:cloud"}, "kimi-k2.5:cloud")
got := names(items)
want := recommendedNames("kimi-k2.5:cloud")
@@ -797,7 +797,7 @@ func TestLauncherClientFilterDisabledCloudModels_ChecksStatusOncePerInvocation(t
apiClient: api.NewClient(u, srv.Client()),
}
filtered := client.filterDisabledCloudModels(context.Background(), []string{"llama3.2", "glm-5.1:cloud", "qwen3.5:cloud"})
filtered := client.filterDisabledCloudModels(context.Background(), []string{"llama3.2", "glm-5.2:cloud", "qwen3.5:cloud"})
if diff := cmp.Diff([]string{"llama3.2"}, filtered); diff != "" {
t.Fatalf("filtered models mismatch (-want +got):\n%s", diff)
}
@@ -1067,11 +1067,11 @@ func TestShowOrPullWithPolicy_CloudModelNotFound_FailsEarlyForAllPolicies(t *tes
u, _ := url.Parse(srv.URL)
client := api.NewClient(u, srv.Client())
err := showOrPullWithPolicy(context.Background(), client, "glm-5.1:cloud", policy, true)
err := showOrPullWithPolicy(context.Background(), client, "glm-5.2:cloud", policy, true)
if err == nil {
t.Fatalf("expected cloud model not-found error for policy %d", policy)
}
if !strings.Contains(err.Error(), `model "glm-5.1:cloud" not found`) {
if !strings.Contains(err.Error(), `model "glm-5.2:cloud" not found`) {
t.Fatalf("expected not-found error for policy %d, got %v", policy, err)
}
if pullCalled {
@@ -1113,7 +1113,7 @@ func TestShowOrPullWithPolicy_CloudModelDisabled_FailsWithCloudDisabledError(t *
u, _ := url.Parse(srv.URL)
client := api.NewClient(u, srv.Client())
err := showOrPullWithPolicy(context.Background(), client, "glm-5.1:cloud", policy, true)
err := showOrPullWithPolicy(context.Background(), client, "glm-5.2:cloud", policy, true)
if err == nil {
t.Fatalf("expected cloud disabled error for policy %d", policy)
}
@@ -1265,11 +1265,11 @@ func TestShowOrPull_CloudModel_NotFoundDoesNotPull(t *testing.T) {
u, _ := url.Parse(srv.URL)
client := api.NewClient(u, srv.Client())
err := showOrPullWithPolicy(context.Background(), client, "glm-5.1:cloud", missingModelPromptPull, true)
err := showOrPullWithPolicy(context.Background(), client, "glm-5.2:cloud", missingModelPromptPull, true)
if err == nil {
t.Error("ShowOrPull should return not-found error for cloud model")
}
if !strings.Contains(err.Error(), `model "glm-5.1:cloud" not found`) {
if !strings.Contains(err.Error(), `model "glm-5.2:cloud" not found`) {
t.Errorf("expected cloud model not-found error, got: %v", err)
}
if pullCalled {
@@ -1528,7 +1528,7 @@ func TestRecommendedModelsDoNotIncludeRequiredPlanStubs(t *testing.T) {
if item := byName["qwen3.5:cloud"]; item.RequiredPlan != "" {
t.Fatalf("qwen fallback required plan = %#v", item)
}
if item := byName["glm-5.1:cloud"]; item.RequiredPlan != "" {
if item := byName["glm-5.2:cloud"]; item.RequiredPlan != "" {
t.Fatalf("glm fallback required plan = %#v", item)
}
}

View File

@@ -975,7 +975,7 @@ func TestLaunchIntegration_ManagedSingleIntegrationCanConfigureWithModelList(t *
t.Fatalf("LaunchIntegration returned error: %v", err)
}
if diff := compareStringSlices(runner.configuredModelLists, [][]string{{"gemma4", "kimi-k2.6:cloud", "qwen3.5:cloud", "glm-5.1:cloud", "minimax-m2.7:cloud", "qwen3.5", "qwen3:8b"}}); diff != "" {
if diff := compareStringSlices(runner.configuredModelLists, [][]string{{"gemma4", "kimi-k2.6:cloud", "qwen3.5:cloud", "glm-5.2:cloud", "minimax-m2.7:cloud", "qwen3.5", "qwen3:8b"}}); diff != "" {
t.Fatalf("configured model list mismatch (-want +got):\n%s", diff)
}
if diff := compareStrings(runner.configured, []string{"gemma4"}); diff != "" {

View File

@@ -64,14 +64,14 @@ func TestModelInventoryResolveDoesNotRefreshCloudMiss(t *testing.T) {
u, _ := url.Parse(srv.URL)
inventory := newModelInventory(api.NewClient(u, srv.Client()))
got := inventory.Resolve(context.Background(), []string{"glm-5.1:cloud"})
got := inventory.Resolve(context.Background(), []string{"glm-5.2:cloud"})
if calls != 1 {
t.Fatalf("List calls = %d, want 1", calls)
}
if len(got) != 1 {
t.Fatalf("Resolve returned %d models, want 1", len(got))
}
if got[0].Name != "glm-5.1:cloud" || !got[0].Remote {
if got[0].Name != "glm-5.2:cloud" || !got[0].Remote {
t.Fatalf("resolved model = %#v, want cloud fallback", got[0])
}
if got[0].ContextLength <= 0 || got[0].MaxOutputTokens <= 0 {

View File

@@ -25,7 +25,7 @@ import (
var recommendedModels = []ModelItem{
{Name: "kimi-k2.6:cloud", Description: "State-of-the-art coding, long-horizon execution, and multimodal agent swarm capability", Recommended: true, Details: api.ModelDetails{ContextLength: 262_144}, MaxOutputTokens: 262_144},
{Name: "qwen3.5:cloud", Description: "Reasoning, coding, and agentic tool use with vision", Recommended: true, Details: api.ModelDetails{ContextLength: 262_144}, MaxOutputTokens: 32_768},
{Name: "glm-5.1:cloud", Description: "Reasoning and code generation", Recommended: true, Details: api.ModelDetails{ContextLength: 202_752}, MaxOutputTokens: 131_072},
{Name: "glm-5.2:cloud", Description: "Reasoning and code generation", Recommended: true, Details: api.ModelDetails{ContextLength: 1_000_000}, MaxOutputTokens: 131_072},
{Name: "minimax-m2.7:cloud", Description: "Fast, efficient coding and real-world productivity", Recommended: true, Details: api.ModelDetails{ContextLength: 204_800}, MaxOutputTokens: 128_000},
{Name: "gemma4", Description: "Reasoning and code generation locally", Recommended: true, VRAMBytes: 12 * format.GigaByte},
{Name: "qwen3.5", Description: "Reasoning, coding, and visual understanding locally", Recommended: true, VRAMBytes: 14 * format.GigaByte},
@@ -59,7 +59,7 @@ var extraCloudModelLimits = map[string]cloudModelLimit{
"glm-4.6": {Context: 202_752, Output: 131_072},
"glm-4.7": {Context: 202_752, Output: 131_072},
"glm-5": {Context: 202_752, Output: 131_072},
"glm-5.1": {Context: 202_752, Output: 131_072},
"glm-5.2": {Context: 1_000_000, Output: 131_072},
"gpt-oss:120b": {Context: 131_072, Output: 131_072},
"gpt-oss:20b": {Context: 131_072, Output: 131_072},
"kimi-k2:1t": {Context: 262_144, Output: 262_144},

View File

@@ -321,8 +321,8 @@ func TestOMPConfigureWithModelsWritesModelsYML(t *testing.T) {
o := &OMP{}
models := []LaunchModel{
{
Name: "glm-5.1:cloud",
ContextLength: 202_752,
Name: "glm-5.2:cloud",
ContextLength: 1_000_000,
MaxOutputTokens: 131_072,
},
{
@@ -330,7 +330,7 @@ func TestOMPConfigureWithModelsWritesModelsYML(t *testing.T) {
Capabilities: []modelpkg.Capability{modelpkg.CapabilityVision},
},
}
if err := o.ConfigureWithModels("glm-5.1:cloud", models); err != nil {
if err := o.ConfigureWithModels("glm-5.2:cloud", models); err != nil {
t.Fatalf("ConfigureWithModels returned error: %v", err)
}
@@ -360,11 +360,11 @@ func TestOMPConfigureWithModelsWritesModelsYML(t *testing.T) {
if len(entries) != 2 {
t.Fatalf("models length = %d, want 2", len(entries))
}
if entries[0]["id"] != "glm-5.1:cloud" {
if entries[0]["id"] != "glm-5.2:cloud" {
t.Fatalf("first model id = %v, want primary first", entries[0]["id"])
}
if got := numericYAMLValue(entries[0]["contextWindow"]); got != 202_752 {
t.Fatalf("contextWindow = %d, want 202752", got)
if got := numericYAMLValue(entries[0]["contextWindow"]); got != 1_000_000 {
t.Fatalf("contextWindow = %d, want 1000000", got)
}
if got := numericYAMLValue(entries[0]["maxTokens"]); got != 131_072 {
t.Fatalf("maxTokens = %d, want 131072", got)
@@ -372,8 +372,8 @@ func TestOMPConfigureWithModelsWritesModelsYML(t *testing.T) {
if input := stringSliceYAMLValue(entries[1]["input"]); !slices.Equal(input, []string{"text", "image"}) {
t.Fatalf("vision input = %v, want [text image]", input)
}
if got := o.CurrentModel(); got != "glm-5.1:cloud" {
t.Fatalf("CurrentModel = %q, want glm-5.1:cloud", got)
if got := o.CurrentModel(); got != "glm-5.2:cloud" {
t.Fatalf("CurrentModel = %q, want glm-5.2:cloud", got)
}
configPath := filepath.Join(home, ".omp", "agent", "config.yml")

View File

@@ -303,7 +303,7 @@ func TestLookupCloudModelLimit(t *testing.T) {
{"glm-4.7", false, 0, 0},
{"glm-4.7:cloud", true, 202_752, 131_072},
{"glm-5:cloud", true, 202_752, 131_072},
{"glm-5.1:cloud", true, 202_752, 131_072},
{"glm-5.2:cloud", true, 1_000_000, 131_072},
{"gemma4:31b-cloud", true, 262_144, 131_072},
{"gpt-oss:120b-cloud", true, 131_072, 131_072},
{"gpt-oss:20b-cloud", true, 131_072, 131_072},

View File

@@ -247,7 +247,7 @@ Ollama Cloud model retirement does not affect local models.
| June 16, 2026 | `kimi-k2-thinking` | `kimi-k2.6` |
| June 16, 2026 | `kimi-k2:1t` | `kimi-k2.6` |
| June 16, 2026 | `minimax-m2` | `minimax-m3` |
| June 16, 2026 | `glm-4.6` | `glm-5.1` |
| June 16, 2026 | `glm-4.6` | `glm-5.2` |
| June 16, 2026 | `qwen3-next:80b` | `qwen3.5` |
| June 16, 2026 | `qwen3-vl:235b` | `qwen3.5` |
| June 16, 2026 | `qwen3-vl:235b-instruct` | `qwen3.5` |

View File

@@ -4,7 +4,7 @@ title: Copilot CLI
GitHub Copilot CLI is GitHub's AI coding agent for the terminal. It can understand your codebase, make edits, run commands, and help you build software faster.
Open models can be used with Copilot CLI through Ollama, enabling you to use models such as `qwen3.5`, `glm-5.1:cloud`, `kimi-k2.5:cloud`.
Open models can be used with Copilot CLI through Ollama, enabling you to use models such as `qwen3.5`, `glm-5.2:cloud`, `kimi-k2.5:cloud`.
## Install

View File

@@ -24,7 +24,7 @@ Ollama handles everything automatically:
**Cloud models**:
- `kimi-k2.5:cloud` — Multimodal reasoning with subagents
- `glm-5.1:cloud` — Reasoning and code generation
- `glm-5.2:cloud` — Reasoning and code generation
- `qwen3.5:cloud` — Reasoning, coding, and agentic tool use with vision
- `minimax-m2.7:cloud` — Fast, efficient coding and real-world productivity

View File

@@ -60,7 +60,7 @@ If the gateway is already running, it restarts automatically to pick up the new
- `kimi-k2.5:cloud` — Multimodal reasoning with subagents
- `qwen3.5:cloud` — Reasoning, coding, and agentic tool use with vision
- `glm-5.1:cloud` — Reasoning and code generation
- `glm-5.2:cloud` — Reasoning and code generation
- `minimax-m2.7:cloud` — Fast, efficient coding and real-world productivity
**Local models:**

View File

@@ -372,9 +372,9 @@ var defaultModelRecommendations = []api.ModelRecommendation{
MaxOutputTokens: 262_144,
},
{
Model: "glm-5.1:cloud",
Model: "glm-5.2:cloud",
Description: "Reasoning and code generation",
ContextLength: 202_752,
ContextLength: 1_000_000,
MaxOutputTokens: 131_072,
},
{

View File

@@ -25,7 +25,7 @@ import (
func TestModelRecommendationsDefaultOrder(t *testing.T) {
want := []string{
"kimi-k2.6:cloud",
"glm-5.1:cloud",
"glm-5.2:cloud",
"qwen3.5:cloud",
"minimax-m2.7:cloud",
"gemma4",