From c8652ca212221f086bb19cf48ff395de1a1490a2 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 15 Aug 2026 14:27:45 +0900 Subject: [PATCH 1/8] feat(ai): add Z.AI GLM-5.3 --- packages/ai/changes.md | 33 +++++++++- packages/ai/scripts/generate-models.ts | 38 ++++++++++-- packages/ai/src/providers/data/.manifest.json | 2 +- .../ai/src/providers/data/zai-coding-cn.json | 2 +- packages/ai/src/providers/data/zai.json | 2 +- .../openai-completions-tool-choice.test.ts | 62 ++++++++++++++++++- packages/coding-agent/changes.md | 15 +++++ .../coding-agent/src/core/model-resolver.ts | 4 +- .../coding-agent/test/model-resolver.test.ts | 6 +- 9 files changed, 149 insertions(+), 15 deletions(-) diff --git a/packages/ai/changes.md b/packages/ai/changes.md index 71bad7110d..7cc40ee1c9 100644 --- a/packages/ai/changes.md +++ b/packages/ai/changes.md @@ -1,5 +1,35 @@ # changes.md — ai +## Add GLM-5.3 to the Z.AI Coding Plan catalog (2026-08-15) + +### What changed + +- `scripts/generate-models.ts`: added reviewed `glm-5.3` fallback metadata that live `models.dev` values can override, including the official 1M-token context, 128K-token output limit, and low/high/max reasoning-effort mapping. +- `src/providers/data/{zai,zai-coding-cn}.json`: regenerated the committed Z.AI snapshots and added `glm-5.3` to the global and China Coding Plan catalogs. +- `test/openai-completions-tool-choice.test.ts`: covers the generated catalog values and the exact `reasoning_effort` payload mapping. + +### Why + +- Z.AI released GLM-5.3 to every Coding Plan tier before adding it to `models.dev`; without a stable fallback, strict generation omits a model that the provider endpoint already serves. +- Z.AI documents the general GLM-5.3 API as coming soon. Coding Plan therefore retains zero metered cost metadata rather than borrowing unannounced API pricing. + +### Why this cannot be expressed as an extension + +- Built-in model IDs, provider request metadata, and their generated TypeScript types are fixed before coding-agent extensions load. + +### Modified upstream files + +- `scripts/generate-models.ts` +- `src/providers/data/.manifest.json` +- `src/providers/data/zai.json` +- `src/providers/data/zai-coding-cn.json` +- `test/openai-completions-tool-choice.test.ts` + +### Expected merge conflict zones + +- MEDIUM: the Z.AI branch in `loadModelsDevData()` when `models.dev` begins publishing GLM-5.3. +- MEDIUM: generated Z.AI provider JSON whenever its live catalog changes. + ## Follow Groq Qwen catalog replacement during generation (2026-08-04) ### What changed @@ -153,7 +183,6 @@ an import + re-export. If upstream edits those predicates, port the edit into `src/utils/prompt-cache-ttl.ts` so the resolver and the adapters stay in agreement. - ## Cover Claude Opus 5 in Anthropic adaptive-thinking metadata (2026-07-25) ### What changed @@ -164,7 +193,7 @@ `mapThinkingLevelToEffort` maps Opus 5 `xhigh`/`max` to native efforts instead of collapsing them to `high`. - `src/providers/data/*.json`: regenerated so every provider that serves Opus 5 (anthropic, github-copilot, opencode, vercel-ai-gateway, openrouter, amazon-bedrock) carries `forceAdaptiveThinking`, `supportsTemperature: - false`, and the `xhigh`/`max` thinking level map. +false`, and the `xhigh`/`max` thinking level map. ### Why diff --git a/packages/ai/scripts/generate-models.ts b/packages/ai/scripts/generate-models.ts index 5772bd1b06..6432a57107 100644 --- a/packages/ai/scripts/generate-models.ts +++ b/packages/ai/scripts/generate-models.ts @@ -237,6 +237,17 @@ const NVIDIA_NIM_UNSUPPORTED_MODELS = new Set([ "upstage/solar-10.7b-instruct", ]); const ZAI_TOOL_STREAM_UNSUPPORTED_MODELS = new Set(["glm-4.5", "glm-4.5-air", "glm-4.5-flash", "glm-4.5v"]); +const ZAI_CODING_STABLE_MODELS = { + "glm-5.3": { + id: "glm-5.3", + name: "GLM-5.3", + tool_call: true, + reasoning: true, + reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], + limit: { context: 1_000_000, output: 131_072 }, + modalities: { input: ["text"] }, + }, +} satisfies Record; const ZAI_GLM52_THINKING_LEVEL_MAP = { minimal: null, low: "high", @@ -244,6 +255,15 @@ const ZAI_GLM52_THINKING_LEVEL_MAP = { high: "high", max: "max", } as const; +const ZAI_GLM53_THINKING_LEVEL_MAP = { + off: "low", + minimal: "low", + low: "low", + medium: "high", + high: "high", + xhigh: "max", + max: "max", +} as const; const OPENCODE_GO_GLM52_THINKING_LEVEL_MAP = { off: null, minimal: null, @@ -1513,13 +1533,23 @@ async function loadModelsDevData(): Promise[]> { ] as const; if (data["zai-coding-plan"]?.models) { + const liveZaiModels = data["zai-coding-plan"].models as Record; + const zaiModels: Record = { + ...ZAI_CODING_STABLE_MODELS, + ...liveZaiModels, + }; for (const { provider, baseUrl } of zaiCodingPlanVariants) { - for (const [modelId, model] of Object.entries(data["zai-coding-plan"].models)) { + for (const [modelId, model] of Object.entries(zaiModels)) { const m = model as ModelsDevModel; if (m.tool_call !== true) continue; const supportsImage = m.modalities?.input?.includes("image"); - const isGlm52 = modelId === "glm-5.2"; + const thinkingLevelMap = + modelId === "glm-5.2" + ? ZAI_GLM52_THINKING_LEVEL_MAP + : modelId === "glm-5.3" + ? ZAI_GLM53_THINKING_LEVEL_MAP + : undefined; models.push({ id: modelId, @@ -1528,7 +1558,7 @@ async function loadModelsDevData(): Promise[]> { provider, baseUrl, reasoning: m.reasoning === true, - ...(isGlm52 ? { thinkingLevelMap: ZAI_GLM52_THINKING_LEVEL_MAP } : {}), + ...(thinkingLevelMap ? { thinkingLevelMap } : {}), input: supportsImage ? ["text", "image"] : ["text"], cost: { input: m.cost?.input || 0, @@ -1539,7 +1569,7 @@ async function loadModelsDevData(): Promise[]> { compat: { supportsDeveloperRole: false, thinkingFormat: "zai", - ...(isGlm52 ? { supportsReasoningEffort: true } : {}), + ...(thinkingLevelMap ? { supportsReasoningEffort: true } : {}), ...(!ZAI_TOOL_STREAM_UNSUPPORTED_MODELS.has(modelId) ? { zaiToolStream: true } : {}), }, contextWindow: m.limit?.context || 4096, diff --git a/packages/ai/src/providers/data/.manifest.json b/packages/ai/src/providers/data/.manifest.json index a8bab74390..d502226f79 100644 --- a/packages/ai/src/providers/data/.manifest.json +++ b/packages/ai/src/providers/data/.manifest.json @@ -1 +1 @@ -{"schemaVersion":3,"generatedAt":"2026-08-06T02:49:06.410Z","structureHash":"650ad7731abd79483e6ec6647ab8618aac3394e65a082a49a42a66d6e729ef88","files":{"alibaba-token-plan.json":"e84668baa90b6ea64fbd9a5192bd3945c5011bc79ac2b4f3e7b3b58467d4403d","amazon-bedrock.json":"d0a215122f81e4497ef45a5f65fd8df067fd22103f10049ad77f4e2f4f10edb4","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"5bf1deecb96805ccba8ec004680e54b1c73ac29a8bfbbf4adaf7c5e66c1ceef2","azure-openai-responses.json":"5315b6a2299fefbdbb6cc13a720544077c9498132ad5e3a7d76a8c1daa8e9335","cerebras.json":"3fd3e19b83ab4be07d27817e25e5be0ffe4158b1394f0311d6a22d9f03847728","cloudflare-ai-gateway.json":"cd050aa8cf61b73b13d532341639e1d0f22fd29d8a889ca669d412cd4b477d45","cloudflare-workers-ai.json":"03b19d69433c843512e953390d51d4578e9b91f19098a9b14ff820c001623598","deepseek.json":"0dcc807a4e5827b488c6ceac87884ff6e735e01cf4f2ddfec9dd812e6fde041b","fireworks.json":"0e10df29511e70b6987cbe27d8d1222c2c5f63b6ddb66c2401a2990a61a5999e","github-copilot.json":"08fd4f44d648f812ea4eeb2aed3e5fbbe08f482afbb51ef64eac1c8ee414f2f9","google-vertex.json":"99d0b89ac9d8dc460ed922236abffbe88c9381af4d35046d2ad3a8f08fa2560c","google.json":"bcf8a8d59ccbb75bc6fb4a261a37ac4b7c806f40ee7313b4411178964be5fa37","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"c5e6e5a9a273f3829160b66ca41d7b400e1bd9e75b44364040962c69f38ba1e2","kimi-coding.json":"9d73ca15313628bb8cf80c21e6466164e350d68471e2d7205b5e21bcd2c141f3","minimax-cn.json":"8ccd71ff838f4b78bb88809babb0dc32a4fcfaec2bc4f4083841000428df4f77","minimax.json":"253edd4c910a41c8bb252400ba099f3a4de0a8900ce154319288ab091b372987","mistral.json":"4f9d84bf1ba10cb14ff2c9e23e77d63441756ef3500375dd4ad10094614b215b","moonshotai-cn.json":"1e6146ff3477883636448c0f44222f0a52b3c4562ef8f4eecf7e941cdd59d12e","moonshotai.json":"d8d5209873058ddccd37c1f026833e2ea3f9476c3dc9628b4a940d407acc0b2e","nvidia.json":"33c498ab62940fe9ca659826c35cc922a77938a5f7edbe4443c10d9133323e87","openai-codex.json":"4a73818291987693fcb53e9e61b4be3429ffd78b3f64ea877a34c5f9928c89e1","openai.json":"2c5d2354c55a80671f20f555844986ab381fee93da26e03c0e42cbae77b519a5","opencode-go.json":"5e6d8256e3b3db2ee3f6783763b8e72b415612f1aa4acf6a305cea51888dde85","opencode.json":"6307dcd0b5167bcb8ad364d98b70ed1a6e22a42328e838c2693c7ef76025d96e","openrouter.json":"d9764c031e634b6ce95e0300d913ea85eef5030f350913a8ea63e221da4a7fa2","qwen-token-plan-cn.json":"cc345d44c31b0ba3b1b244f8b56342ede6657584653f3af176026bf8dbb37cd5","qwen-token-plan.json":"12c43b2b8032e1b64222616588daf400156f3819be4de3124fc997a69eccbda8","together.json":"c01b9a0790a0d4bc442953a9e66d733a5a058cc7b82826aa58a2946a7012d416","vercel-ai-gateway.json":"eada6738e094247dd9dded694f1a7baac96fbc85c8a2c8dc6d5bfae2555b84d4","xai.json":"4cbdbfbbf915246369b9bacbc6f1feeb56accdac9f3444456343f750547f2f38","xiaomi-token-plan-ams.json":"b1886b741867c90a838c377e86ad64b26ca6b0e349f1a75bc5fd4ed99df03c21","xiaomi-token-plan-cn.json":"11f459b794eddd64a9d9d102f2799c364732b7f0d562e22573f4995a5d1e1a30","xiaomi-token-plan-sgp.json":"0b9953d03b75260aba0ad604cc76d7ed26d6841448819e8c7488bf0d90948d2c","xiaomi.json":"edf39e0edd9dcae23e669635ea782e5870c0b9663d4b918b8ff9bd307cfe35f8","zai-coding-cn.json":"c2d1e137238b6f248b5f620f76b64520aa2ba1543e991dd0d14b708e50c8cd66","zai.json":"cb48b354442f1e49919cd93b928216d5d881d2f98a55349ad592a8e68bb8e6c3"}} +{"schemaVersion":3,"generatedAt":"2026-08-15T05:28:30.012Z","structureHash":"5778e96dc4083e50adb9c4a1ebc53934e92074598f3bfcc6b4e677a434bf0afd","files":{"alibaba-token-plan.json":"e84668baa90b6ea64fbd9a5192bd3945c5011bc79ac2b4f3e7b3b58467d4403d","amazon-bedrock.json":"d0a215122f81e4497ef45a5f65fd8df067fd22103f10049ad77f4e2f4f10edb4","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"5bf1deecb96805ccba8ec004680e54b1c73ac29a8bfbbf4adaf7c5e66c1ceef2","azure-openai-responses.json":"5315b6a2299fefbdbb6cc13a720544077c9498132ad5e3a7d76a8c1daa8e9335","cerebras.json":"3fd3e19b83ab4be07d27817e25e5be0ffe4158b1394f0311d6a22d9f03847728","cloudflare-ai-gateway.json":"cd050aa8cf61b73b13d532341639e1d0f22fd29d8a889ca669d412cd4b477d45","cloudflare-workers-ai.json":"03b19d69433c843512e953390d51d4578e9b91f19098a9b14ff820c001623598","deepseek.json":"0dcc807a4e5827b488c6ceac87884ff6e735e01cf4f2ddfec9dd812e6fde041b","fireworks.json":"0e10df29511e70b6987cbe27d8d1222c2c5f63b6ddb66c2401a2990a61a5999e","github-copilot.json":"08fd4f44d648f812ea4eeb2aed3e5fbbe08f482afbb51ef64eac1c8ee414f2f9","google-vertex.json":"99d0b89ac9d8dc460ed922236abffbe88c9381af4d35046d2ad3a8f08fa2560c","google.json":"bcf8a8d59ccbb75bc6fb4a261a37ac4b7c806f40ee7313b4411178964be5fa37","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"c5e6e5a9a273f3829160b66ca41d7b400e1bd9e75b44364040962c69f38ba1e2","kimi-coding.json":"9d73ca15313628bb8cf80c21e6466164e350d68471e2d7205b5e21bcd2c141f3","minimax-cn.json":"8ccd71ff838f4b78bb88809babb0dc32a4fcfaec2bc4f4083841000428df4f77","minimax.json":"253edd4c910a41c8bb252400ba099f3a4de0a8900ce154319288ab091b372987","mistral.json":"4f9d84bf1ba10cb14ff2c9e23e77d63441756ef3500375dd4ad10094614b215b","moonshotai-cn.json":"1e6146ff3477883636448c0f44222f0a52b3c4562ef8f4eecf7e941cdd59d12e","moonshotai.json":"d8d5209873058ddccd37c1f026833e2ea3f9476c3dc9628b4a940d407acc0b2e","nvidia.json":"33c498ab62940fe9ca659826c35cc922a77938a5f7edbe4443c10d9133323e87","openai-codex.json":"4a73818291987693fcb53e9e61b4be3429ffd78b3f64ea877a34c5f9928c89e1","openai.json":"2c5d2354c55a80671f20f555844986ab381fee93da26e03c0e42cbae77b519a5","opencode-go.json":"5e6d8256e3b3db2ee3f6783763b8e72b415612f1aa4acf6a305cea51888dde85","opencode.json":"6307dcd0b5167bcb8ad364d98b70ed1a6e22a42328e838c2693c7ef76025d96e","openrouter.json":"d9764c031e634b6ce95e0300d913ea85eef5030f350913a8ea63e221da4a7fa2","qwen-token-plan-cn.json":"cc345d44c31b0ba3b1b244f8b56342ede6657584653f3af176026bf8dbb37cd5","qwen-token-plan.json":"12c43b2b8032e1b64222616588daf400156f3819be4de3124fc997a69eccbda8","together.json":"c01b9a0790a0d4bc442953a9e66d733a5a058cc7b82826aa58a2946a7012d416","vercel-ai-gateway.json":"eada6738e094247dd9dded694f1a7baac96fbc85c8a2c8dc6d5bfae2555b84d4","xai.json":"4cbdbfbbf915246369b9bacbc6f1feeb56accdac9f3444456343f750547f2f38","xiaomi-token-plan-ams.json":"b1886b741867c90a838c377e86ad64b26ca6b0e349f1a75bc5fd4ed99df03c21","xiaomi-token-plan-cn.json":"11f459b794eddd64a9d9d102f2799c364732b7f0d562e22573f4995a5d1e1a30","xiaomi-token-plan-sgp.json":"0b9953d03b75260aba0ad604cc76d7ed26d6841448819e8c7488bf0d90948d2c","xiaomi.json":"edf39e0edd9dcae23e669635ea782e5870c0b9663d4b918b8ff9bd307cfe35f8","zai-coding-cn.json":"ce947350fde7e6b8cda77cc9301027c54801b3aec6d15ea945fa9ad075921730","zai.json":"05026fc8e0c7bdae51fdaf8e4757d8a7d34f09c763b63dd3237f8f559e8453b6"}} diff --git a/packages/ai/src/providers/data/zai-coding-cn.json b/packages/ai/src/providers/data/zai-coding-cn.json index dfd0289f04..babf5a3f67 100644 --- a/packages/ai/src/providers/data/zai-coding-cn.json +++ b/packages/ai/src/providers/data/zai-coding-cn.json @@ -1 +1 @@ -{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"minimal":null,"low":"high","medium":"high","high":"high","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} +{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"minimal":null,"low":"high","medium":"high","high":"high","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"low","minimal":"low","low":"low","medium":"high","high":"high","xhigh":"max","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} diff --git a/packages/ai/src/providers/data/zai.json b/packages/ai/src/providers/data/zai.json index e9fccd27d8..2ad9a7721f 100644 --- a/packages/ai/src/providers/data/zai.json +++ b/packages/ai/src/providers/data/zai.json @@ -1 +1 @@ -{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"minimal":null,"low":"high","medium":"high","high":"high","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} +{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"minimal":null,"low":"high","medium":"high","high":"high","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"low","minimal":"low","low":"low","medium":"high","high":"high","xhigh":"max","max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} diff --git a/packages/ai/test/openai-completions-tool-choice.test.ts b/packages/ai/test/openai-completions-tool-choice.test.ts index 380c2f8458..4aa88f38b8 100644 --- a/packages/ai/test/openai-completions-tool-choice.test.ts +++ b/packages/ai/test/openai-completions-tool-choice.test.ts @@ -372,6 +372,7 @@ describe("openai-completions tool_choice", () => { expect(getModel("zai", "glm-4.7")?.compat?.zaiToolStream).toBe(true); expect(getModel("zai", "glm-5-turbo")?.compat?.zaiToolStream).toBe(true); expect(getModel("zai", "glm-5.2")?.compat?.zaiToolStream).toBe(true); + expect(getModel("zai", "glm-5.3")?.compat?.zaiToolStream).toBe(true); }); it("stores z.ai GLM-5.2 effort metadata", () => { @@ -387,6 +388,61 @@ describe("openai-completions tool_choice", () => { }); } }); + it("stores z.ai GLM-5.3 catalog and effort metadata", () => { + for (const provider of ["zai", "zai-coding-cn"] as const) { + const model = getModel(provider, "glm-5.3")!; + expect(model).toMatchObject({ + name: "GLM-5.3", + reasoning: true, + input: ["text"], + contextWindow: 1_000_000, + maxTokens: 131_072, + }); + expect(model.compat?.supportsReasoningEffort).toBe(true); + expect(model.thinkingLevelMap).toEqual({ + off: "low", + minimal: "low", + low: "low", + medium: "high", + high: "high", + xhigh: "max", + max: "max", + }); + } + }); + + it("maps z.ai GLM-5.3 thinking levels to reasoning_effort", async () => { + const model = getModel("zai", "glm-5.3")!; + const cases = [ + { reasoning: "low", effort: "low" }, + { reasoning: "medium", effort: "high" }, + { reasoning: "high", effort: "high" }, + { reasoning: "xhigh", effort: "max" }, + { reasoning: "max", effort: "max" }, + ] as const; + + for (const testCase of cases) { + let payload: unknown; + + await streamSimple( + model, + { + messages: [{ role: "user", content: "Hi", timestamp: Date.now() }], + }, + { + apiKey: "test", + reasoning: testCase.reasoning, + onPayload: (params: unknown) => { + payload = params; + }, + }, + ).result(); + + const params = (payload ?? mockState.lastParams) as { thinking?: unknown; reasoning_effort?: string }; + expect(params.thinking).toEqual({ type: "enabled", clear_thinking: false }); + expect(params.reasoning_effort).toBe(testCase.effort); + } + }); it("maps z.ai GLM-5.2 thinking levels to reasoning_effort", async () => { const model = getModel("zai", "glm-5.2")!; @@ -1555,7 +1611,11 @@ describe("openai-completions tool_choice", () => { }); it("sends max_tokens for Z.AI completions models", async () => { - const cases = [getModel("zai", "glm-5-turbo")!, getModel("zai", "glm-5.2")!] as const; + const cases = [ + getModel("zai", "glm-5-turbo")!, + getModel("zai", "glm-5.2")!, + getModel("zai", "glm-5.3")!, + ] as const; for (const model of cases) { expect(model.compat?.maxTokensField).toBe("max_tokens"); diff --git a/packages/coding-agent/changes.md b/packages/coding-agent/changes.md index 126dbc64b3..6b23da9a14 100644 --- a/packages/coding-agent/changes.md +++ b/packages/coding-agent/changes.md @@ -1,5 +1,20 @@ # Local fork changes +## 2026-08-15 — Track GLM-5.3 as the Z.AI default + +### What changed + +- Updated the global and China Z.AI provider defaults from `glm-5.2` to the newly bundled `glm-5.3`. +- Updated default-resolution coverage to require the selected model to exist in each generated catalog. + +### Why this lives in the fork + +- Senpi owns initial provider-model selection; the AI package only supplies the catalog. + +### Merge notes + +- LOW: `src/core/model-resolver.ts` conflicts only when upstream changes provider defaults. + ## 2026-08-03 — Keep Bun off unpublished workspace identities ### What changed diff --git a/packages/coding-agent/src/core/model-resolver.ts b/packages/coding-agent/src/core/model-resolver.ts index 2e50a543bd..3d9481064f 100644 --- a/packages/coding-agent/src/core/model-resolver.ts +++ b/packages/coding-agent/src/core/model-resolver.ts @@ -44,8 +44,8 @@ export const defaultModelPerProvider: Record = { xai: "grok-4.5", groq: "openai/gpt-oss-120b", cerebras: "zai-glm-4.7", - zai: "glm-5.2", - "zai-coding-cn": "glm-5.2", + zai: "glm-5.3", + "zai-coding-cn": "glm-5.3", mistral: "devstral-medium-latest", minimax: "MiniMax-M2.7", "minimax-cn": "MiniMax-M2.7", diff --git a/packages/coding-agent/test/model-resolver.test.ts b/packages/coding-agent/test/model-resolver.test.ts index 688129873a..d0f842731a 100644 --- a/packages/coding-agent/test/model-resolver.test.ts +++ b/packages/coding-agent/test/model-resolver.test.ts @@ -643,8 +643,8 @@ describe("default model selection", () => { }); test("zai, minimax, cerebras, and ant-ling defaults track current models", () => { - expect(defaultModelPerProvider.zai).toBe("glm-5.2"); - expect(defaultModelPerProvider["zai-coding-cn"]).toBe("glm-5.2"); + expect(defaultModelPerProvider.zai).toBe("glm-5.3"); + expect(defaultModelPerProvider["zai-coding-cn"]).toBe("glm-5.3"); expect(defaultModelPerProvider.minimax).toBe("MiniMax-M2.7"); expect(defaultModelPerProvider["minimax-cn"]).toBe("MiniMax-M2.7"); expect(defaultModelPerProvider.cerebras).toBe("zai-glm-4.7"); @@ -730,7 +730,7 @@ describe("default model selection", () => { expect(result.provenance).toBe("provider-default"); expect(result.model?.provider).toBe("zai"); - expect(result.model?.id).toBe("glm-5.2"); + expect(result.model?.id).toBe("glm-5.3"); }); test("findInitialModel ignores an unauthenticated saved default", async () => { From 55d5bc2f1b737d7f82e15c54b0fe343fa7b33238 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 21:44:32 +0900 Subject: [PATCH 2/8] fix(ai): preserve GLM-5.3 family reasoning controls --- packages/ai/src/providers/data/.manifest.json | 2 +- .../ai/src/providers/data/zai-coding-cn.json | 2 +- packages/ai/src/providers/data/zai.json | 2 +- packages/coding-agent/src/core/changes.md | 18 ++++++++++++++++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/ai/src/providers/data/.manifest.json b/packages/ai/src/providers/data/.manifest.json index 8cbe000eea..763b3a1d7c 100644 --- a/packages/ai/src/providers/data/.manifest.json +++ b/packages/ai/src/providers/data/.manifest.json @@ -1 +1 @@ -{"schemaVersion":3,"generatedAt":"2026-08-29T12:00:09.745Z","structureHash":"3c455a74fcf9a66fed76da0baeafab7eec982373b540beefb9d588b18318c185","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"eb1770cb9edee5efb9646da27043a83cc80fa5e186dce60fcafa681222b794c2","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"8c1136a83a3b1ff0e61ab461ee221b1de7680784e774a60e1520af14a44bb0f1","azure-openai-responses.json":"37d12c5cbfc29bfd9a802a0516f5d3209320bd4aa8ef9cd7c219af208244afa3","baseten.json":"e4d1ec84e8180a53e21c1511b8d78e497784515c33ba8397382ac3450c8b126e","cerebras.json":"38272a7525d6680c71bb4bb3c4085e871768b400832e2013b0e7fd92f8fd4f05","cloudflare-ai-gateway.json":"38d37fefcc6437904f42437881e782d31a79982942c25a48cb8fe9a255afbaa2","cloudflare-workers-ai.json":"0ed67191adec10707a8ce1ed2c99a949dd06ec537de15d6b57e830575d248b86","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"21dbcb60719ae099beda44a8fe03dc725b00bf3767c32bd1027d288061d30ffe","github-copilot.json":"61dec9e46df61a9b0bf6c7618651f97bfa9ae609d4c216b5725f014942ca3001","google-vertex.json":"fb7586fc955da7b7d7d11d641954f496fbbb42cf3e4cbba66d7116ea3b37d5ed","google.json":"b5572904165d37ab594eafc3ab7f29774e35747b5dd211144ec01532db9217c1","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"7616a851e53d254e375b760abe2b6148e8961a102bd5c7af31829a0f2dc8e5c5","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"dbf1b71ee36812fe64b014177ff455809a8dd852bbbd584422645beb85635127","moonshotai.json":"2d7518b4769e97ac900366175c8b60ff86a02675bb6f6cc2fffcc6761fda6faa","nvidia.json":"62fa810bece1c90454b481db5a3ff78bc66dc28dab9c65a655397eb1dfe2de73","openai-codex.json":"4e4afe2929b2b20a751f2453b219deae4e5b9fd85e147bd0403601f183cfc15f","openai.json":"b014fb0676fec97264eb13b367b0ed73b99915f45410a3dd9a7397a0360c2a4b","opencode-go.json":"1b707b5fdaf0bbe9b436a2fa662b9ade1f1c7db0ffc0631916428547483acaac","opencode.json":"ab2bf29b6c0b097c9dca13faab7515365787da523e6e942b49002a2612b99d26","opengateway.json":"1702a5df9877110c4d71a6ff3760cd10b378bfbd32d6322c05ce59dc1cc0f8e4","openrouter.json":"065d4eb3817363dc217cc9bea7130a0cf30c0ad934819b63a5a4c29ef9919943","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"c2b03c476d6b4d4059ed18a80f34d274c754dc84fe2591ae79fe2986512f2a51","vercel-ai-gateway.json":"df4810da53726a9465ec6ddb6c5ec6d66955552f6ca7aa5d01f18f3ffe02cbe7","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"b3fe0a69833cb573ee73fa4ed3f620732b3193fc32f5433d2fa9971c2f5ce299","zai.json":"6634870e983bdae76dddbf2e721e972fbc4b5974467b4b99edaab5bd9c1c1e3f"}} +{"schemaVersion":3,"generatedAt":"2026-08-29T12:43:56.610Z","structureHash":"3c455a74fcf9a66fed76da0baeafab7eec982373b540beefb9d588b18318c185","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"eb1770cb9edee5efb9646da27043a83cc80fa5e186dce60fcafa681222b794c2","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"8c1136a83a3b1ff0e61ab461ee221b1de7680784e774a60e1520af14a44bb0f1","azure-openai-responses.json":"37d12c5cbfc29bfd9a802a0516f5d3209320bd4aa8ef9cd7c219af208244afa3","baseten.json":"e4d1ec84e8180a53e21c1511b8d78e497784515c33ba8397382ac3450c8b126e","cerebras.json":"38272a7525d6680c71bb4bb3c4085e871768b400832e2013b0e7fd92f8fd4f05","cloudflare-ai-gateway.json":"38d37fefcc6437904f42437881e782d31a79982942c25a48cb8fe9a255afbaa2","cloudflare-workers-ai.json":"0ed67191adec10707a8ce1ed2c99a949dd06ec537de15d6b57e830575d248b86","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"21dbcb60719ae099beda44a8fe03dc725b00bf3767c32bd1027d288061d30ffe","github-copilot.json":"61dec9e46df61a9b0bf6c7618651f97bfa9ae609d4c216b5725f014942ca3001","google-vertex.json":"fb7586fc955da7b7d7d11d641954f496fbbb42cf3e4cbba66d7116ea3b37d5ed","google.json":"b5572904165d37ab594eafc3ab7f29774e35747b5dd211144ec01532db9217c1","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"7616a851e53d254e375b760abe2b6148e8961a102bd5c7af31829a0f2dc8e5c5","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"dbf1b71ee36812fe64b014177ff455809a8dd852bbbd584422645beb85635127","moonshotai.json":"2d7518b4769e97ac900366175c8b60ff86a02675bb6f6cc2fffcc6761fda6faa","nvidia.json":"62fa810bece1c90454b481db5a3ff78bc66dc28dab9c65a655397eb1dfe2de73","openai-codex.json":"4e4afe2929b2b20a751f2453b219deae4e5b9fd85e147bd0403601f183cfc15f","openai.json":"b014fb0676fec97264eb13b367b0ed73b99915f45410a3dd9a7397a0360c2a4b","opencode-go.json":"1b707b5fdaf0bbe9b436a2fa662b9ade1f1c7db0ffc0631916428547483acaac","opencode.json":"ab2bf29b6c0b097c9dca13faab7515365787da523e6e942b49002a2612b99d26","opengateway.json":"1702a5df9877110c4d71a6ff3760cd10b378bfbd32d6322c05ce59dc1cc0f8e4","openrouter.json":"95029f4b75a435a6744b9b484327820751bc53e0bed914580fb12f8757399309","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"c2b03c476d6b4d4059ed18a80f34d274c754dc84fe2591ae79fe2986512f2a51","vercel-ai-gateway.json":"df4810da53726a9465ec6ddb6c5ec6d66955552f6ca7aa5d01f18f3ffe02cbe7","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}} diff --git a/packages/ai/src/providers/data/zai-coding-cn.json b/packages/ai/src/providers/data/zai-coding-cn.json index 0250a2c3e6..72efe358bd 100644 --- a/packages/ai/src/providers/data/zai-coding-cn.json +++ b/packages/ai/src/providers/data/zai-coding-cn.json @@ -1 +1 @@ -{"openai-completions":{"glm-4.6v":{"id":"glm-4.6v","name":"GLM-4.6V","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":0.3,"output":0.9,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":128000,"maxTokens":32768},"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.1":{"id":"glm-5.1","name":"GLM-5.1","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-flash":{"id":"glm-5.3-flash","name":"GLM-5.3-Flash","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":0.075,"output":0.25,"cacheRead":0.015,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-highspeed":{"id":"glm-5.3-highspeed","name":"GLM-5.3 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5v-turbo":{"id":"glm-5v-turbo","name":"GLM-5V-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072}}} +{"openai-completions":{"glm-4.6v":{"id":"glm-4.6v","name":"GLM-4.6V","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":0.3,"output":0.9,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":128000,"maxTokens":32768},"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.1":{"id":"glm-5.1","name":"GLM-5.1","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-flash":{"id":"glm-5.3-flash","name":"GLM-5.3-Flash","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text","image"],"cost":{"input":0.075,"output":0.25,"cacheRead":0.015,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-highspeed":{"id":"glm-5.3-highspeed","name":"GLM-5.3 Highspeed","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5v-turbo":{"id":"glm-5v-turbo","name":"GLM-5V-Turbo","api":"openai-completions","provider":"zai-coding-cn","baseUrl":"https://open.bigmodel.cn/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072}}} diff --git a/packages/ai/src/providers/data/zai.json b/packages/ai/src/providers/data/zai.json index 364ff9b177..95654f5313 100644 --- a/packages/ai/src/providers/data/zai.json +++ b/packages/ai/src/providers/data/zai.json @@ -1 +1 @@ -{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-flash":{"id":"glm-5.3-flash","name":"GLM-5.3-Flash","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text","image"],"cost":{"input":0.075,"output":0.25,"cacheRead":0.015,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-highspeed":{"id":"glm-5.3-highspeed","name":"GLM-5.3 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} +{"openai-completions":{"glm-4.7":{"id":"glm-4.7","name":"GLM-4.7","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":0.6,"output":2.2,"cacheRead":0.11,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":204800,"maxTokens":131072},"glm-5-turbo":{"id":"glm-5-turbo","name":"GLM-5-Turbo","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"input":["text"],"cost":{"input":1.2,"output":4,"cacheRead":0.24,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":false,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":200000,"maxTokens":131072},"glm-5.2":{"id":"glm-5.2","name":"GLM-5.2","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.2-highspeed":{"id":"glm-5.2-highspeed","name":"GLM-5.2 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":"none","minimal":null,"low":null,"medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3":{"id":"glm-5.3","name":"GLM-5.3","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":1.4,"output":4.4,"cacheRead":0.26,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-flash":{"id":"glm-5.3-flash","name":"GLM-5.3-Flash","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text","image"],"cost":{"input":0.075,"output":0.25,"cacheRead":0.015,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072},"glm-5.3-highspeed":{"id":"glm-5.3-highspeed","name":"GLM-5.3 Highspeed","api":"openai-completions","provider":"zai","baseUrl":"https://api.z.ai/api/coding/paas/v4","reasoning":true,"thinkingLevelMap":{"off":null,"minimal":null,"low":"low","medium":null,"high":"high","xhigh":null,"max":"max"},"input":["text"],"cost":{"input":0,"output":0,"cacheRead":0,"cacheWrite":0},"compat":{"supportsStore":false,"supportsDeveloperRole":false,"supportsReasoningEffort":true,"maxTokensField":"max_tokens","thinkingFormat":"zai","zaiToolStream":true},"contextWindow":1000000,"maxTokens":131072}}} diff --git a/packages/coding-agent/src/core/changes.md b/packages/coding-agent/src/core/changes.md index 3afdfe3898..b83d633648 100644 --- a/packages/coding-agent/src/core/changes.md +++ b/packages/coding-agent/src/core/changes.md @@ -1,5 +1,23 @@ # changes +## 2026-08-29 - GLM-5.3 model resolver defaults + +### What changed + +- `packages/coding-agent/src/core/model-resolver.ts`: retain the GLM-5.3 Z.AI global and China default model and prompt-preset resolution introduced by this PR. + +### Why + +- The new Z.AI model family must remain the default for both coding-plan provider variants after synchronizing with upstream changes. + +### Why an extension could not handle it + +- Provider defaults and model-pattern resolution are core resolver behavior that runs before extension hooks and cannot be replaced by an extension. + +### Expected merge conflict zones + +- `packages/coding-agent/src/core/model-resolver.ts`: provider default mappings and model pattern resolution. + ## 2026-08-29 - Make externally owned compaction delegation sticky ### What changed From 825c06e40227b1c36ac3cd76ae2b1a5e4ab00370 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 21:45:01 +0900 Subject: [PATCH 3/8] test(ai): cover GLM-5.3 variant reasoning controls --- packages/ai/test/glm-5.3-thinking.test.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/ai/test/glm-5.3-thinking.test.ts b/packages/ai/test/glm-5.3-thinking.test.ts index 421cefcb02..68ec21dd85 100644 --- a/packages/ai/test/glm-5.3-thinking.test.ts +++ b/packages/ai/test/glm-5.3-thinking.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; -import { streamSimple } from "../src/compat.ts"; +import { getModel, streamSimple } from "../src/compat.ts"; import type { Model } from "../src/types.ts"; const mockState = vi.hoisted(() => ({ @@ -84,15 +84,19 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( "maps low effort for the %s through the zai thinking-level map (not raw)", async (id) => { - const params = await captureParams(glm53OnZai(id), "low"); + const model = getModel("zai", id); + expect(model).toBeDefined(); + const params = await captureParams(model!, "low"); expect(params.reasoning_effort).toBe("low"); }, ); it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( "maps high and max effort for the %s", async (id) => { - await expect(captureParams(glm53OnZai(id), "high")).resolves.toMatchObject({ reasoning_effort: "high" }); - await expect(captureParams(glm53OnZai(id), "max")).resolves.toMatchObject({ reasoning_effort: "max" }); + const model = getModel("zai", id); + expect(model).toBeDefined(); + await expect(captureParams(model!, "high")).resolves.toMatchObject({ reasoning_effort: "high" }); + await expect(captureParams(model!, "max")).resolves.toMatchObject({ reasoning_effort: "max" }); }, ); @@ -108,7 +112,9 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( "keeps thinking enabled for %s when reasoning is off", async (id) => { - const params = await captureParams(glm53OnZai(id), "off"); + const model = getModel("zai", id); + expect(model).toBeDefined(); + const params = await captureParams(model!, "off"); expect(params.thinking?.type).toBe("enabled"); }, ); From f2d53700efa94ebae396f6d7d946190d29c2b50d Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 21:47:14 +0900 Subject: [PATCH 4/8] fix(ai): complete GLM-5.3 review follow-ups --- packages/ai/changes.md | 18 ++++++++++++++++++ packages/ai/src/providers/data/.manifest.json | 2 +- packages/ai/test/glm-5.3-thinking.test.ts | 8 +++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/packages/ai/changes.md b/packages/ai/changes.md index c0c32bea27..274fa34dee 100644 --- a/packages/ai/changes.md +++ b/packages/ai/changes.md @@ -1,5 +1,23 @@ # changes.md — ai +## 2026-08-29 - Preserve GLM-5.3 variant reasoning controls + +### What changed + +- `packages/ai/scripts/generate-models.ts`: recognize `glm-5.3` Flash and Highspeed variants as part of the Z.AI GLM-5.3 family so generated metadata retains low/high/max reasoning effort mappings and wire support. + +### Why + +- Without family matching, explicit reasoning effort selections were dropped for the Flash and Highspeed models and their model controls exposed incorrect levels. + +### Why an extension could not handle it + +- Model-family metadata and request serialization are built into the AI package generator and provider adapter before extension code can intervene. + +### Expected merge conflict zones + +- `packages/ai/scripts/generate-models.ts`: Z.AI model-family detection and generated capability metadata. + ## 2026-08-29 - Z.AI GLM-5.3 request and catalog fixes - GLM-5.3 reasoning-off requests now use the provider's lowest enabled effort instead of sending the rejected disabled-thinking payload; regenerated Z.AI catalogs retain the separate global and China sources and published model metadata. diff --git a/packages/ai/src/providers/data/.manifest.json b/packages/ai/src/providers/data/.manifest.json index 763b3a1d7c..7c8fc0d345 100644 --- a/packages/ai/src/providers/data/.manifest.json +++ b/packages/ai/src/providers/data/.manifest.json @@ -1 +1 @@ -{"schemaVersion":3,"generatedAt":"2026-08-29T12:43:56.610Z","structureHash":"3c455a74fcf9a66fed76da0baeafab7eec982373b540beefb9d588b18318c185","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"eb1770cb9edee5efb9646da27043a83cc80fa5e186dce60fcafa681222b794c2","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"8c1136a83a3b1ff0e61ab461ee221b1de7680784e774a60e1520af14a44bb0f1","azure-openai-responses.json":"37d12c5cbfc29bfd9a802a0516f5d3209320bd4aa8ef9cd7c219af208244afa3","baseten.json":"e4d1ec84e8180a53e21c1511b8d78e497784515c33ba8397382ac3450c8b126e","cerebras.json":"38272a7525d6680c71bb4bb3c4085e871768b400832e2013b0e7fd92f8fd4f05","cloudflare-ai-gateway.json":"38d37fefcc6437904f42437881e782d31a79982942c25a48cb8fe9a255afbaa2","cloudflare-workers-ai.json":"0ed67191adec10707a8ce1ed2c99a949dd06ec537de15d6b57e830575d248b86","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"21dbcb60719ae099beda44a8fe03dc725b00bf3767c32bd1027d288061d30ffe","github-copilot.json":"61dec9e46df61a9b0bf6c7618651f97bfa9ae609d4c216b5725f014942ca3001","google-vertex.json":"fb7586fc955da7b7d7d11d641954f496fbbb42cf3e4cbba66d7116ea3b37d5ed","google.json":"b5572904165d37ab594eafc3ab7f29774e35747b5dd211144ec01532db9217c1","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"7616a851e53d254e375b760abe2b6148e8961a102bd5c7af31829a0f2dc8e5c5","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"dbf1b71ee36812fe64b014177ff455809a8dd852bbbd584422645beb85635127","moonshotai.json":"2d7518b4769e97ac900366175c8b60ff86a02675bb6f6cc2fffcc6761fda6faa","nvidia.json":"62fa810bece1c90454b481db5a3ff78bc66dc28dab9c65a655397eb1dfe2de73","openai-codex.json":"4e4afe2929b2b20a751f2453b219deae4e5b9fd85e147bd0403601f183cfc15f","openai.json":"b014fb0676fec97264eb13b367b0ed73b99915f45410a3dd9a7397a0360c2a4b","opencode-go.json":"1b707b5fdaf0bbe9b436a2fa662b9ade1f1c7db0ffc0631916428547483acaac","opencode.json":"ab2bf29b6c0b097c9dca13faab7515365787da523e6e942b49002a2612b99d26","opengateway.json":"1702a5df9877110c4d71a6ff3760cd10b378bfbd32d6322c05ce59dc1cc0f8e4","openrouter.json":"95029f4b75a435a6744b9b484327820751bc53e0bed914580fb12f8757399309","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"c2b03c476d6b4d4059ed18a80f34d274c754dc84fe2591ae79fe2986512f2a51","vercel-ai-gateway.json":"df4810da53726a9465ec6ddb6c5ec6d66955552f6ca7aa5d01f18f3ffe02cbe7","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}} +{"schemaVersion":3,"generatedAt":"2026-08-29T12:46:36.807Z","structureHash":"3c455a74fcf9a66fed76da0baeafab7eec982373b540beefb9d588b18318c185","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"eb1770cb9edee5efb9646da27043a83cc80fa5e186dce60fcafa681222b794c2","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"8c1136a83a3b1ff0e61ab461ee221b1de7680784e774a60e1520af14a44bb0f1","azure-openai-responses.json":"37d12c5cbfc29bfd9a802a0516f5d3209320bd4aa8ef9cd7c219af208244afa3","baseten.json":"e4d1ec84e8180a53e21c1511b8d78e497784515c33ba8397382ac3450c8b126e","cerebras.json":"38272a7525d6680c71bb4bb3c4085e871768b400832e2013b0e7fd92f8fd4f05","cloudflare-ai-gateway.json":"38d37fefcc6437904f42437881e782d31a79982942c25a48cb8fe9a255afbaa2","cloudflare-workers-ai.json":"0ed67191adec10707a8ce1ed2c99a949dd06ec537de15d6b57e830575d248b86","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"21dbcb60719ae099beda44a8fe03dc725b00bf3767c32bd1027d288061d30ffe","github-copilot.json":"61dec9e46df61a9b0bf6c7618651f97bfa9ae609d4c216b5725f014942ca3001","google-vertex.json":"fb7586fc955da7b7d7d11d641954f496fbbb42cf3e4cbba66d7116ea3b37d5ed","google.json":"b5572904165d37ab594eafc3ab7f29774e35747b5dd211144ec01532db9217c1","groq.json":"f1eb899453e70b5e4479fe6eb78869ee99121fa6d4a019a5a05ab42d2ada8992","huggingface.json":"7616a851e53d254e375b760abe2b6148e8961a102bd5c7af31829a0f2dc8e5c5","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"dbf1b71ee36812fe64b014177ff455809a8dd852bbbd584422645beb85635127","moonshotai.json":"2d7518b4769e97ac900366175c8b60ff86a02675bb6f6cc2fffcc6761fda6faa","nvidia.json":"62fa810bece1c90454b481db5a3ff78bc66dc28dab9c65a655397eb1dfe2de73","openai-codex.json":"4e4afe2929b2b20a751f2453b219deae4e5b9fd85e147bd0403601f183cfc15f","openai.json":"b014fb0676fec97264eb13b367b0ed73b99915f45410a3dd9a7397a0360c2a4b","opencode-go.json":"1b707b5fdaf0bbe9b436a2fa662b9ade1f1c7db0ffc0631916428547483acaac","opencode.json":"ab2bf29b6c0b097c9dca13faab7515365787da523e6e942b49002a2612b99d26","opengateway.json":"1702a5df9877110c4d71a6ff3760cd10b378bfbd32d6322c05ce59dc1cc0f8e4","openrouter.json":"065d4eb3817363dc217cc9bea7130a0cf30c0ad934819b63a5a4c29ef9919943","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"c2b03c476d6b4d4059ed18a80f34d274c754dc84fe2591ae79fe2986512f2a51","vercel-ai-gateway.json":"df4810da53726a9465ec6ddb6c5ec6d66955552f6ca7aa5d01f18f3ffe02cbe7","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}} \ No newline at end of file diff --git a/packages/ai/test/glm-5.3-thinking.test.ts b/packages/ai/test/glm-5.3-thinking.test.ts index 68ec21dd85..8454aa9a8f 100644 --- a/packages/ai/test/glm-5.3-thinking.test.ts +++ b/packages/ai/test/glm-5.3-thinking.test.ts @@ -2,6 +2,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { getModel, streamSimple } from "../src/compat.ts"; import type { Model } from "../src/types.ts"; +type Glm53Variant = "glm-5.3-flash" | "glm-5.3-highspeed"; + const mockState = vi.hoisted(() => ({ lastParams: undefined as unknown, })); @@ -83,7 +85,7 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( "maps low effort for the %s through the zai thinking-level map (not raw)", - async (id) => { + async (id: Glm53Variant) => { const model = getModel("zai", id); expect(model).toBeDefined(); const params = await captureParams(model!, "low"); @@ -92,7 +94,7 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { ); it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( - "maps high and max effort for the %s", async (id) => { + "maps high and max effort for the %s", async (id: Glm53Variant) => { const model = getModel("zai", id); expect(model).toBeDefined(); await expect(captureParams(model!, "high")).resolves.toMatchObject({ reasoning_effort: "high" }); @@ -111,7 +113,7 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { }); it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( - "keeps thinking enabled for %s when reasoning is off", async (id) => { + "keeps thinking enabled for %s when reasoning is off", async (id: Glm53Variant) => { const model = getModel("zai", id); expect(model).toBeDefined(); const params = await captureParams(model!, "off"); From 202190bb000aca8ca3bc127b64dbcc17caf67761 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 21:47:36 +0900 Subject: [PATCH 5/8] docs(ai): track GLM-5.3 reasoning fix --- packages/ai/CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/ai/CHANGELOG.md b/packages/ai/CHANGELOG.md index e08eae7b23..3f9e583825 100644 --- a/packages/ai/CHANGELOG.md +++ b/packages/ai/CHANGELOG.md @@ -10,6 +10,8 @@ ### Fixed +- Preserve GLM-5.3 Flash and Highspeed reasoning effort mappings and Z.AI thinking serialization. + ### Removed ## [2026.8.29] - 2026-08-29 From 25d97b1db5cea8446c2d55800dbfbaa224e583b4 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 21:48:36 +0900 Subject: [PATCH 6/8] test(ai): type GLM-5.3 variant cases --- packages/ai/test/glm-5.3-thinking.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ai/test/glm-5.3-thinking.test.ts b/packages/ai/test/glm-5.3-thinking.test.ts index 8454aa9a8f..9717868a80 100644 --- a/packages/ai/test/glm-5.3-thinking.test.ts +++ b/packages/ai/test/glm-5.3-thinking.test.ts @@ -85,8 +85,8 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( "maps low effort for the %s through the zai thinking-level map (not raw)", - async (id: Glm53Variant) => { - const model = getModel("zai", id); + async (id) => { + const model = getModel("zai", id as Glm53Variant); expect(model).toBeDefined(); const params = await captureParams(model!, "low"); expect(params.reasoning_effort).toBe("low"); @@ -94,8 +94,8 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { ); it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( - "maps high and max effort for the %s", async (id: Glm53Variant) => { - const model = getModel("zai", id); + "maps high and max effort for the %s", async (id) => { + const model = getModel("zai", id as Glm53Variant); expect(model).toBeDefined(); await expect(captureParams(model!, "high")).resolves.toMatchObject({ reasoning_effort: "high" }); await expect(captureParams(model!, "max")).resolves.toMatchObject({ reasoning_effort: "max" }); @@ -113,8 +113,8 @@ describe("GLM 5.3 openai-completions reasoning effort", () => { }); it.each(["glm-5.3-flash", "glm-5.3-highspeed"])( - "keeps thinking enabled for %s when reasoning is off", async (id: Glm53Variant) => { - const model = getModel("zai", id); + "keeps thinking enabled for %s when reasoning is off", async (id) => { + const model = getModel("zai", id as Glm53Variant); expect(model).toBeDefined(); const params = await captureParams(model!, "off"); expect(params.thinking?.type).toBe("enabled"); From 8788835b95b8e32a68bd992cdd37cfd99f7cc8d5 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 23:04:48 +0900 Subject: [PATCH 7/8] test(ai): cover unsupported GLM-5.3 generator variants --- packages/ai/src/changes.md | 20 +++++++ .../ai/test/generate-models-strict.test.ts | 55 +++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/packages/ai/src/changes.md b/packages/ai/src/changes.md index 163a4d2427..e6c6dcf97c 100644 --- a/packages/ai/src/changes.md +++ b/packages/ai/src/changes.md @@ -208,6 +208,26 @@ The divergence lives in core wiring, package identity, or build plumbing that ex ## Unreleased +## 2026-08-29 - Cover GLM-5.3 generator negative variants + +### What changed + +- `packages/ai/src/api/openai-completions.ts`: added nearest-tracker coverage for the validated GLM-5.3 serializer path and its unsupported-variant regression behavior. +- `scripts/generate-models.ts`: generated Z.AI records for unsupported GLM-5.3 variants omit `thinkingLevelMap` and `compat.supportsReasoningEffort`. +- `test/generate-models-strict.test.ts`: added an offline generator fixture covering `glm-5.3-turbo`, `glm-5.3-xl`, and `glm-5.3-anything-else`. + +### Why + +- The generator must not grant reasoning controls to unsupported GLM-5.3 aliases, and the nearest tracker must record the provider adapter change. + +### Why an extension could not handle it + +- Generated model capability metadata and OpenAI Completions request serialization are implemented inside the AI package. + +### Expected merge conflict zones + +- LOW: `src/api/openai-completions.ts` and the GLM-5.3 generator regression coverage. + ## 2026-08-26 - Coalesce adjacent Anthropic user turns ### What changed diff --git a/packages/ai/test/generate-models-strict.test.ts b/packages/ai/test/generate-models-strict.test.ts index 30d44a4db4..e35bd632a6 100644 --- a/packages/ai/test/generate-models-strict.test.ts +++ b/packages/ai/test/generate-models-strict.test.ts @@ -13,6 +13,61 @@ afterEach(() => { }); describe("strict model generation", () => { + it("omits reasoning metadata for unsupported GLM-5.3 variants in generated output", () => { + const fixtureRoot = mkdtempSync(join(tmpdir(), "pi-generate-models-glm-5-3-")); + temporaryRoots.push(fixtureRoot); + const isolatedPackageRoot = join(fixtureRoot, "package"); + mkdirSync(isolatedPackageRoot); + for (const entry of ["package.json", "scripts", "src"]) { + cpSync(join(packageRoot, entry), join(isolatedPackageRoot, entry), { recursive: true }); + } + const outputDir = join(fixtureRoot, "output"); + const preloadPath = join(fixtureRoot, "mock-models.mjs"); + const unsupportedVariants = ["glm-5.3-turbo", "glm-5.3-xl", "glm-5.3-anything-else"]; + const sourceModels = Object.fromEntries( + unsupportedVariants.map((id) => [ + id, + { + id, + name: id, + tool_call: true, + reasoning: true, + reasoning_options: [{ type: "effort", values: ["low", "high", "max"] }], + }, + ]), + ); + const catalog = { + "zai-coding-plan": { models: sourceModels }, + "zhipuai-coding-plan": { models: sourceModels }, + }; + writeFileSync( + preloadPath, + `const modelsDev = ${JSON.stringify(catalog)};\n` + + `globalThis.fetch = async (input) => {\n` + + ` const url = String(input);\n` + + ` if (url === "https://models.dev/api.json") return new Response(JSON.stringify(modelsDev), { status: 200 });\n` + + ` if (url === "https://openrouter.ai/api/v1/models") return new Response(JSON.stringify({ data: [] }), { status: 200 });\n` + + ` if (url === "https://ai-gateway.vercel.sh/v1/models") return new Response(JSON.stringify({ data: [] }), { status: 200 });\n` + + ` if (url === "https://apis.opengateway.ai/v1/models") return new Response(JSON.stringify({ data: [] }), { status: 200 });\n` + + ` throw new Error(\`Unexpected fetch: \${url}\`);\n` + + `};\n`, + ); + + const result = spawnSync( + process.execPath, + ["--import", pathToFileURL(preloadPath).href, "scripts/generate-models.ts", "--json-only", "--json-output", outputDir], + { cwd: isolatedPackageRoot, encoding: "utf8", timeout: 10_000 }, + ); + + expect(result.status).toBe(0); + const generated = JSON.parse(readFileSync(join(outputDir, "providers", "zai.json"), "utf8")); + for (const id of unsupportedVariants) { + expect(generated[id]).toBeDefined(); + expect(generated[id].thinkingLevelMap).toBeUndefined(); + expect(generated[id].compat?.supportsReasoningEffort).not.toBe(true); + } + }); + it("fails before mutating generated data when an Individual model loses tool support", () => { const fixtureRoot = mkdtempSync(join(tmpdir(), "pi-generate-models-")); temporaryRoots.push(fixtureRoot); From 7df5cc6a8a0daa1ae0f0e5ef344772f81fb75e4b Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Sat, 29 Aug 2026 23:37:57 +0900 Subject: [PATCH 8/8] docs(ai): correct GLM-5.3 matcher changelog --- packages/ai/src/changes.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ai/src/changes.md b/packages/ai/src/changes.md index e6c6dcf97c..9618c130ad 100644 --- a/packages/ai/src/changes.md +++ b/packages/ai/src/changes.md @@ -212,13 +212,13 @@ The divergence lives in core wiring, package identity, or build plumbing that ex ### What changed -- `packages/ai/src/api/openai-completions.ts`: added nearest-tracker coverage for the validated GLM-5.3 serializer path and its unsupported-variant regression behavior. +- `packages/ai/src/api/openai-completions.ts`: narrowed the Z.AI always-enabled matcher to the exact `glm-5.3`, `glm-5.3-flash`, and `glm-5.3-highspeed` variants so unsupported variants are not forced into thinking. - `scripts/generate-models.ts`: generated Z.AI records for unsupported GLM-5.3 variants omit `thinkingLevelMap` and `compat.supportsReasoningEffort`. - `test/generate-models-strict.test.ts`: added an offline generator fixture covering `glm-5.3-turbo`, `glm-5.3-xl`, and `glm-5.3-anything-else`. ### Why -- The generator must not grant reasoning controls to unsupported GLM-5.3 aliases, and the nearest tracker must record the provider adapter change. +- Unsupported GLM-5.3 variants must not receive reasoning metadata or be forced into enabled thinking; only the validated base, Flash, and Highspeed variants should use the always-enabled Z.AI thinking path. ### Why an extension could not handle it @@ -226,7 +226,7 @@ The divergence lives in core wiring, package identity, or build plumbing that ex ### Expected merge conflict zones -- LOW: `src/api/openai-completions.ts` and the GLM-5.3 generator regression coverage. +- LOW: `api/openai-completions.ts` and the GLM-5.3 generator regression coverage. ## 2026-08-26 - Coalesce adjacent Anthropic user turns