Compare commits

...

1 Commits

Author SHA1 Message Date
Peter Steinberger
6046639da2 build: bump pi deps and trim model shims 2026-02-13 00:45:22 +01:00
9 changed files with 398 additions and 270 deletions

View File

@@ -42,7 +42,11 @@ Docs: https://docs.openclaw.ai
- Signal: enforce E.164 validation for the Signal bot account prompt so mistyped numbers are caught early. (#15063) Thanks @Duartemartins.
- Signal: render mention placeholders as `@uuid`/`@phone` so mention gating and Clawdbot targeting work. (#2013) Thanks @alexgleason.
- Onboarding/Providers: add Z.AI endpoint-specific auth choices (`zai-coding-global`, `zai-coding-cn`, `zai-global`, `zai-cn`) and expand default Z.AI model wiring. (#13456) Thanks @tomsun28.
- Onboarding/Providers: auto-detect the correct Z.AI endpoint for your API key (prefer general API + `zai/glm-5`; fall back to Coding Plan + `zai/glm-4.7`) and add GLM-5 forward-compat resolution when provider catalogs lag. (#14786) Thanks @steipete.
- Onboarding/Providers: update MiniMax API default/recommended models from M2.1 to M2.5, add M2.5/M2.5-Lightning model entries, and include `minimax-m2.5` in modern model filtering. (#14865) Thanks @adao-max.
- Dependencies: bump `@mariozechner/pi-agent-core`, `@mariozechner/pi-ai`, `@mariozechner/pi-coding-agent`, and `@mariozechner/pi-tui` to `0.52.10`.
- Agents: remove redundant OpenAI Codex and Z.AI GLM-5 forward-compat model shims now that latest pi catalogs these model IDs directly.
- Auto-reply: include `openai-codex/gpt-5.3-codex-spark` in xhigh thinking support.
- Ollama: use configured `models.providers.ollama.baseUrl` for model discovery and normalize `/v1` endpoints to the native Ollama API root. (#14131) Thanks @shtse8.
- Voice Call: pass Twilio stream auth token via `<Parameter>` instead of query string. (#14029) Thanks @mcwigglesmcgee.
- Feishu: pass `Buffer` directly to the Feishu SDK upload APIs instead of `Readable.from(...)` to avoid form-data upload failures. (#10345) Thanks @youngerstyle.

View File

@@ -21,10 +21,10 @@ OpenClaw uses the pi SDK to embed an AI coding agent into its messaging gateway
```json
{
"@mariozechner/pi-agent-core": "0.49.3",
"@mariozechner/pi-ai": "0.49.3",
"@mariozechner/pi-coding-agent": "0.49.3",
"@mariozechner/pi-tui": "0.49.3"
"@mariozechner/pi-agent-core": "0.52.10",
"@mariozechner/pi-ai": "0.52.10",
"@mariozechner/pi-coding-agent": "0.52.10",
"@mariozechner/pi-tui": "0.52.10"
}
```

View File

@@ -119,10 +119,10 @@
"@larksuiteoapi/node-sdk": "^1.59.0",
"@line/bot-sdk": "^10.6.0",
"@lydell/node-pty": "1.2.0-beta.3",
"@mariozechner/pi-agent-core": "0.52.9",
"@mariozechner/pi-ai": "0.52.9",
"@mariozechner/pi-coding-agent": "0.52.9",
"@mariozechner/pi-tui": "0.52.9",
"@mariozechner/pi-agent-core": "0.52.10",
"@mariozechner/pi-ai": "0.52.10",
"@mariozechner/pi-coding-agent": "0.52.10",
"@mariozechner/pi-tui": "0.52.10",
"@mozilla/readability": "^0.6.0",
"@sinclair/typebox": "0.34.48",
"@slack/bolt": "^4.6.0",

441
pnpm-lock.yaml generated
View File

@@ -47,17 +47,17 @@ importers:
specifier: 1.2.0-beta.3
version: 1.2.0-beta.3
'@mariozechner/pi-agent-core':
specifier: 0.52.9
version: 0.52.9(ws@8.19.0)(zod@4.3.6)
specifier: 0.52.10
version: 0.52.10(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-ai':
specifier: 0.52.9
version: 0.52.9(ws@8.19.0)(zod@4.3.6)
specifier: 0.52.10
version: 0.52.10(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-coding-agent':
specifier: 0.52.9
version: 0.52.9(ws@8.19.0)(zod@4.3.6)
specifier: 0.52.10
version: 0.52.10(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-tui':
specifier: 0.52.9
version: 0.52.9
specifier: 0.52.10
version: 0.52.10
'@mozilla/readability':
specifier: ^0.6.0
version: 0.6.0
@@ -630,8 +630,8 @@ packages:
'@aws-crypto/util@5.2.0':
resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
'@aws-sdk/client-bedrock-runtime@3.988.0':
resolution: {integrity: sha512-NZlsQ8rjmAG0zRteqEiRakV97/nToIwDqT0zbye+j+HN60wiRSESAFCEozdwiiuVr0xl69NcoTiMg64xbh2I9g==}
'@aws-sdk/client-bedrock-runtime@3.989.0':
resolution: {integrity: sha512-qVa5B0wXjIuPRhX1dcZo1sa9Y4ycI9tiqK7B4FLok67gUWckiKmEf1xQDFrTmc2eCK5g0CTaeiRdbeM1eWmW1Q==}
engines: {node: '>=20.0.0'}
'@aws-sdk/client-bedrock@3.988.0':
@@ -642,42 +642,82 @@ packages:
resolution: {integrity: sha512-ThqQ7aF1k0Zz4yJRwegHw+T1rM3a7ZPvvEUSEdvn5Z8zTeWgJAbtqW/6ejPsMLmFOlHgNcwDQN/e69OvtEOoIQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/client-sso@3.989.0':
resolution: {integrity: sha512-3sC+J1ru5VFXLgt9KZmXto0M7mnV5RkS6FNGwRMK3XrojSjHso9DLOWjbnXhbNv4motH8vu53L1HK2VC1+Nj5w==}
engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.973.8':
resolution: {integrity: sha512-WeYJ2sfvRLbbUIrjGMUXcEHGu5SJk53jz3K9F8vFP42zWyROzPJ2NB6lMu9vWl5hnMwzwabX7pJc9Euh3JyMGw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.973.9':
resolution: {integrity: sha512-cyUOfJSizn8da7XrBEFBf4UMI4A6JQNX6ZFcKtYmh/CrwfzsDcabv3k/z0bNwQ3pX5aeq5sg/8Bs/ASiL0bJaA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-env@3.972.6':
resolution: {integrity: sha512-+dYEBWgTqkQQHFUllvBL8SLyXyLKWdxLMD1LmKJRvmb0NMJuaJFG/qg78C+LE67eeGbipYcE+gJ48VlLBGHlMw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-env@3.972.7':
resolution: {integrity: sha512-r8kBtglvLjGxBT87l6Lqkh9fL8yJJ6O4CYQPjKlj3AkCuL4/4784x3rxxXWw9LTKXOo114VB6mjxAuy5pI7XIg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-http@3.972.8':
resolution: {integrity: sha512-z3QkozMV8kOFisN2pgRag/f0zPDrw96mY+ejAM0xssV/+YQ2kklbylRNI/TcTQUDnGg0yPxNjyV6F2EM2zPTwg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-http@3.972.9':
resolution: {integrity: sha512-40caFblEg/TPrp9EpvyMxp4xlJ5TuTI+A8H6g8FhHn2hfH2PObFAPLF9d5AljK/G69E1YtTklkuQeAwPlV3w8Q==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-ini@3.972.6':
resolution: {integrity: sha512-6tkIYFv3sZH1XsjQq+veOmx8XWRnyqTZ5zx/sMtdu/xFRIzrJM1Y2wAXeCJL1rhYSB7uJSZ1PgALI2WVTj78ow==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-ini@3.972.7':
resolution: {integrity: sha512-zeYKrMwM5bCkHFho/x3+1OL0vcZQ0OhTR7k35tLq74+GP5ieV3juHXTZfa2LVE0Bg75cHIIerpX0gomVOhzo/w==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-login@3.972.6':
resolution: {integrity: sha512-LXsoBoaTSGHdRCQXlWSA0CHHh05KWncb592h9ElklnPus++8kYn1Ic6acBR4LKFQ0RjjMVgwe5ypUpmTSUOjPA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-login@3.972.7':
resolution: {integrity: sha512-Q103cLU6OjAllYjX7+V+PKQw654jjvZUkD+lbUUiFbqut6gR5zwl1DrelvJPM5hnzIty7BCaxaRB3KMuz3M/ug==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-node@3.972.7':
resolution: {integrity: sha512-PuJ1IkISG7ZDpBFYpGotaay6dYtmriBYuHJ/Oko4VHxh8YN5vfoWnMNYFEWuzOfyLmP7o9kDVW0BlYIpb3skvw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-node@3.972.8':
resolution: {integrity: sha512-AaDVOT7iNJyLjc3j91VlucPZ4J8Bw+eu9sllRDugJqhHWYyR3Iyp2huBUW8A3+DfHoh70sxGkY92cThAicSzlQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-process@3.972.6':
resolution: {integrity: sha512-Yf34cjIZJHVnD92jnVYy3tNjM+Q4WJtffLK2Ehn0nKpZfqd1m7SI0ra22Lym4C53ED76oZENVSS2wimoXJtChQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-process@3.972.7':
resolution: {integrity: sha512-hxMo1V3ujWWrQSONxQJAElnjredkRpB6p8SDjnvRq70IwYY38R/CZSys0IbhRPxdgWZ5j12yDRk2OXhxw4Gj3g==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-sso@3.972.6':
resolution: {integrity: sha512-2+5UVwUYdD4BBOkLpKJ11MQ8wQeyJGDVMDRH5eWOULAh9d6HJq07R69M/mNNMC9NTjr3mB1T0KGDn4qyQh5jzg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-sso@3.972.7':
resolution: {integrity: sha512-ZGKBOHEj8Ap15jhG2XMncQmKLTqA++2DVU2eZfLu3T/pkwDyhCp5eZv5c/acFxbZcA/6mtxke+vzO/n+aeHs4A==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-web-identity@3.972.6':
resolution: {integrity: sha512-pdJzwKtlDxBnvZ04pWMqttijmkUIlwOsS0GcxCjzEVyUMpARysl0S0ks74+gs2Pdev3Ujz+BTAjOc1tQgAxGqA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-web-identity@3.972.7':
resolution: {integrity: sha512-AbYupBIoSJoVMlbMqBhNvPhqj+CdGtzW7Uk4ZIMBm2br18pc3rkG1VaKVFV85H87QCvLHEnni1idJjaX1wOmIw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/eventstream-handler-node@3.972.5':
resolution: {integrity: sha512-xEmd3dnyn83K6t4AJxBJA63wpEoCD45ERFG0XMTViD2E/Ohls9TLxjOWPb1PAxR9/46cKy/TImez1GoqP6xVNQ==}
engines: {node: '>=20.0.0'}
@@ -702,6 +742,10 @@ packages:
resolution: {integrity: sha512-3PGL+Kvh1PhB0EeJeqNqOWQgipdqFheO4OUKc6aYiFwEpM5t9AyE5hjjxZ5X6iSj8JiduWFZLPwASzF6wQRgFg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/middleware-user-agent@3.972.9':
resolution: {integrity: sha512-1g1B7yf7KzessB0mKNiV9gAHEwbM662xgU+VE4LxyGe6kVGZ8LqYsngjhE+Stna09CJ7Pxkjr6Uq1OtbGwJJJg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/middleware-websocket@3.972.6':
resolution: {integrity: sha512-1DedO6N3m8zQ/vG6twNiHtsdwBgk773VdavLEbB3NXeKZDlzSK1BTviqWwvJdKx5UnIy4kGGP6WWpCEFEt/bhQ==}
engines: {node: '>= 14.0.0'}
@@ -710,6 +754,10 @@ packages:
resolution: {integrity: sha512-OgYV9k1oBCQ6dOM+wWAMNNehXA8L4iwr7ydFV+JDHyuuu0Ko7tDXnLEtEmeQGYRcAFU3MGasmlBkMB8vf4POrg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/nested-clients@3.989.0':
resolution: {integrity: sha512-Dbk2HMPU3mb6RrSRzgf0WCaWSbgtZG258maCpuN2/ONcAQNpOTw99V5fU5CA1qVK6Vkm4Fwj2cnOnw7wbGVlOw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/region-config-resolver@3.972.3':
resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==}
engines: {node: '>=20.0.0'}
@@ -718,6 +766,10 @@ packages:
resolution: {integrity: sha512-xvXVlRVKHnF2h6fgWBm64aPP5J+58aJyGfRrQa/uFh8a9mcK68mLfJOYq+ZSxQy/UN3McafJ2ILAy7IWzT9kRw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/token-providers@3.989.0':
resolution: {integrity: sha512-OdBByMv+OjOZoekrk4THPFpLuND5aIQbDHCGh3n2rvifAbm31+6e0OLhxSeCF1UMPm+nKq12bXYYEoCIx5SQBg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/types@3.973.1':
resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==}
engines: {node: '>=20.0.0'}
@@ -726,6 +778,10 @@ packages:
resolution: {integrity: sha512-HuXu4boeUWU0DQiLslbgdvuQ4ZMCo4Lsk97w8BIUokql2o9MvjE5dwqI5pzGt0K7afO1FybjidUQVTMLuZNTOA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/util-endpoints@3.989.0':
resolution: {integrity: sha512-eKmAOeQM4Qusq0jtcbZPiNWky8XaojByKC/n+THbJ8vJf7t4ys8LlcZ4PrBSHZISe9cC484mQsPVOQh6iySjqw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/util-format-url@3.972.3':
resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==}
engines: {node: '>=20.0.0'}
@@ -746,6 +802,15 @@ packages:
aws-crt:
optional: true
'@aws-sdk/util-user-agent-node@3.972.7':
resolution: {integrity: sha512-oyhv+FjrgHjP+F16cmsrJzNP4qaRJzkV1n9Lvv4uyh3kLqo3rIe9NSBSBa35f2TedczfG2dD+kaQhHBB47D6Og==}
engines: {node: '>=20.0.0'}
peerDependencies:
aws-crt: '>=1.0.0'
peerDependenciesMeta:
aws-crt:
optional: true
'@aws-sdk/xml-builder@3.972.4':
resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==}
engines: {node: '>=20.0.0'}
@@ -1240,18 +1305,14 @@ packages:
cpu: [x64]
os: [win32]
'@isaacs/balanced-match@4.0.1':
resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
engines: {node: 20 || >=22}
'@isaacs/brace-expansion@5.0.1':
resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==}
engines: {node: 20 || >=22}
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
'@isaacs/cliui@9.0.0':
resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==}
engines: {node: '>=18'}
'@isaacs/fs-minipass@4.0.1':
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
engines: {node: '>=18.0.0'}
@@ -1456,22 +1517,22 @@ packages:
resolution: {integrity: sha512-faGUlTcXka5l7rv0lP3K3vGW/ejRuOS24RR2aSFWREUQqzjgdsuWNo/IiPqL3kWRGt6Ahl2+qcDAwtdeWeuGUw==}
hasBin: true
'@mariozechner/pi-agent-core@0.52.9':
resolution: {integrity: sha512-x6OxWN5QnZGfK5TU822Xgcy5QeN3ZGIBaZiZISRI64BZYj5ENc40j4T+fbeRnAsrEkJoMC1Him8ixw68PRTovQ==}
'@mariozechner/pi-agent-core@0.52.10':
resolution: {integrity: sha512-rTM3ug6rMuDFbQINympIIV9CW3Z8ONyBSehsoDNWtdXTWNA7Nzpx3mAYsA91B856HM0Zbl45UBNRN1YHDeaFTg==}
engines: {node: '>=20.0.0'}
'@mariozechner/pi-ai@0.52.9':
resolution: {integrity: sha512-sCdIVw7iomWcaEnVUFwq9e69Dat0ZCy/+XGkTtroY8H+GxHmDKUCrJV/yMpu8Jq9Oof11yCo7F/Vco7dvYCLZg==}
'@mariozechner/pi-ai@0.52.10':
resolution: {integrity: sha512-dgV5emMbDoz0GGyDy6CjY+RcW/PqwQvUzqAehjDUj1M+3b7+fIB7E2WKZQKvjYIY79qTvAIyrdEmIs2BQX+enA==}
engines: {node: '>=20.0.0'}
hasBin: true
'@mariozechner/pi-coding-agent@0.52.9':
resolution: {integrity: sha512-XZ0z2k8awEzKVj83Vwj64aO1rTaHe7xk3GppHVdjkvaDDXRWwUtTdm9benH3kuYQ9Po+vuGc9plcApTV9LXpZw==}
'@mariozechner/pi-coding-agent@0.52.10':
resolution: {integrity: sha512-88gBrk+aDKMe4M6hY63LT8ylXEeoNdwnKHB7Ijmxzw5ShtWl7+H8vTBIwxZu/5yNR2b4VhjB0NGi3khpwT5I1A==}
engines: {node: '>=20.0.0'}
hasBin: true
'@mariozechner/pi-tui@0.52.9':
resolution: {integrity: sha512-YHVZLRz9ULVlubRi51P1AQj7oOb+caiTv/HsNa7r587ale8kLNBx2Sa99fRWuFhNPu+SniwVi4pgqvkrWAcd/w==}
'@mariozechner/pi-tui@0.52.10':
resolution: {integrity: sha512-j0re5FXzznkrzC7BOc1fb+DUWYetRZAVSUbdZoxa6S5S7amxmIJzbSNCgKBaF1ZyY40jp+B5Z4W60Qc7Pn1rxA==}
engines: {node: '>=20.0.0'}
'@matrix-org/matrix-sdk-crypto-nodejs@0.4.0':
@@ -3359,6 +3420,10 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
balanced-match@4.0.2:
resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==}
engines: {node: 20 || >=22}
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
@@ -3405,6 +3470,10 @@ packages:
brace-expansion@2.0.2:
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
brace-expansion@5.0.2:
resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==}
engines: {node: 20 || >=22}
browser-or-node@1.3.0:
resolution: {integrity: sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==}
@@ -3981,8 +4050,8 @@ packages:
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
hasBin: true
glob@13.0.2:
resolution: {integrity: sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ==}
glob@13.0.3:
resolution: {integrity: sha512-/g3B0mC+4x724v1TgtBlBtt2hPi/EWptsIAmXUx9Z2rvBYleQcsrmaOzd5LyL50jf/Soi83ZDJmw2+XqvH/EeA==}
engines: {node: 20 || >=22}
google-auth-library@10.5.0:
@@ -4218,6 +4287,10 @@ packages:
jackspeak@3.4.3:
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
jackspeak@4.2.3:
resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==}
engines: {node: 20 || >=22}
jiti@2.6.1:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
@@ -4564,8 +4637,8 @@ packages:
minimalistic-assert@1.0.1:
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
minimatch@10.1.2:
resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==}
minimatch@10.2.0:
resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==}
engines: {node: 20 || >=22}
minimatch@9.0.5:
@@ -5886,25 +5959,25 @@ snapshots:
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
'@aws-sdk/client-bedrock-runtime@3.988.0':
'@aws-sdk/client-bedrock-runtime@3.989.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.973.8
'@aws-sdk/credential-provider-node': 3.972.7
'@aws-sdk/core': 3.973.9
'@aws-sdk/credential-provider-node': 3.972.8
'@aws-sdk/eventstream-handler-node': 3.972.5
'@aws-sdk/middleware-eventstream': 3.972.3
'@aws-sdk/middleware-host-header': 3.972.3
'@aws-sdk/middleware-logger': 3.972.3
'@aws-sdk/middleware-recursion-detection': 3.972.3
'@aws-sdk/middleware-user-agent': 3.972.8
'@aws-sdk/middleware-user-agent': 3.972.9
'@aws-sdk/middleware-websocket': 3.972.6
'@aws-sdk/region-config-resolver': 3.972.3
'@aws-sdk/token-providers': 3.988.0
'@aws-sdk/token-providers': 3.989.0
'@aws-sdk/types': 3.973.1
'@aws-sdk/util-endpoints': 3.988.0
'@aws-sdk/util-endpoints': 3.989.0
'@aws-sdk/util-user-agent-browser': 3.972.3
'@aws-sdk/util-user-agent-node': 3.972.6
'@aws-sdk/util-user-agent-node': 3.972.7
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.23.0
'@smithy/eventstream-serde-browser': 4.2.8
@@ -6026,6 +6099,49 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/client-sso@3.989.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.973.9
'@aws-sdk/middleware-host-header': 3.972.3
'@aws-sdk/middleware-logger': 3.972.3
'@aws-sdk/middleware-recursion-detection': 3.972.3
'@aws-sdk/middleware-user-agent': 3.972.9
'@aws-sdk/region-config-resolver': 3.972.3
'@aws-sdk/types': 3.973.1
'@aws-sdk/util-endpoints': 3.989.0
'@aws-sdk/util-user-agent-browser': 3.972.3
'@aws-sdk/util-user-agent-node': 3.972.7
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.23.0
'@smithy/fetch-http-handler': 5.3.9
'@smithy/hash-node': 4.2.8
'@smithy/invalid-dependency': 4.2.8
'@smithy/middleware-content-length': 4.2.8
'@smithy/middleware-endpoint': 4.4.14
'@smithy/middleware-retry': 4.4.31
'@smithy/middleware-serde': 4.2.9
'@smithy/middleware-stack': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/node-http-handler': 4.4.10
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.11.3
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
'@smithy/util-body-length-node': 4.2.1
'@smithy/util-defaults-mode-browser': 4.3.30
'@smithy/util-defaults-mode-node': 4.2.33
'@smithy/util-endpoints': 3.2.8
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/core@3.973.8':
dependencies:
'@aws-sdk/types': 3.973.1
@@ -6042,6 +6158,22 @@ snapshots:
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
'@aws-sdk/core@3.973.9':
dependencies:
'@aws-sdk/types': 3.973.1
'@aws-sdk/xml-builder': 3.972.4
'@smithy/core': 3.23.0
'@smithy/node-config-provider': 4.3.8
'@smithy/property-provider': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/signature-v4': 5.3.8
'@smithy/smithy-client': 4.11.3
'@smithy/types': 4.12.0
'@smithy/util-base64': 4.3.0
'@smithy/util-middleware': 4.2.8
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
'@aws-sdk/credential-provider-env@3.972.6':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6050,6 +6182,14 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/credential-provider-env@3.972.7':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.972.8':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6063,6 +6203,19 @@ snapshots:
'@smithy/util-stream': 4.5.12
tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.972.9':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/types': 3.973.1
'@smithy/fetch-http-handler': 5.3.9
'@smithy/node-http-handler': 4.4.10
'@smithy/property-provider': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.11.3
'@smithy/types': 4.12.0
'@smithy/util-stream': 4.5.12
tslib: 2.8.1
'@aws-sdk/credential-provider-ini@3.972.6':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6082,6 +6235,25 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-ini@3.972.7':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/credential-provider-env': 3.972.7
'@aws-sdk/credential-provider-http': 3.972.9
'@aws-sdk/credential-provider-login': 3.972.7
'@aws-sdk/credential-provider-process': 3.972.7
'@aws-sdk/credential-provider-sso': 3.972.7
'@aws-sdk/credential-provider-web-identity': 3.972.7
'@aws-sdk/nested-clients': 3.989.0
'@aws-sdk/types': 3.973.1
'@smithy/credential-provider-imds': 4.2.8
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-login@3.972.6':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6095,6 +6267,19 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-login@3.972.7':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/nested-clients': 3.989.0
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/protocol-http': 5.3.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-node@3.972.7':
dependencies:
'@aws-sdk/credential-provider-env': 3.972.6
@@ -6112,6 +6297,23 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-node@3.972.8':
dependencies:
'@aws-sdk/credential-provider-env': 3.972.7
'@aws-sdk/credential-provider-http': 3.972.9
'@aws-sdk/credential-provider-ini': 3.972.7
'@aws-sdk/credential-provider-process': 3.972.7
'@aws-sdk/credential-provider-sso': 3.972.7
'@aws-sdk/credential-provider-web-identity': 3.972.7
'@aws-sdk/types': 3.973.1
'@smithy/credential-provider-imds': 4.2.8
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-process@3.972.6':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6121,6 +6323,15 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/credential-provider-process@3.972.7':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/credential-provider-sso@3.972.6':
dependencies:
'@aws-sdk/client-sso': 3.988.0
@@ -6134,6 +6345,19 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-sso@3.972.7':
dependencies:
'@aws-sdk/client-sso': 3.989.0
'@aws-sdk/core': 3.973.9
'@aws-sdk/token-providers': 3.989.0
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-web-identity@3.972.6':
dependencies:
'@aws-sdk/core': 3.973.8
@@ -6146,6 +6370,18 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/credential-provider-web-identity@3.972.7':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/nested-clients': 3.989.0
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/eventstream-handler-node@3.972.5':
dependencies:
'@aws-sdk/types': 3.973.1
@@ -6191,6 +6427,16 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/middleware-user-agent@3.972.9':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/types': 3.973.1
'@aws-sdk/util-endpoints': 3.989.0
'@smithy/core': 3.23.0
'@smithy/protocol-http': 5.3.8
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/middleware-websocket@3.972.6':
dependencies:
'@aws-sdk/types': 3.973.1
@@ -6249,6 +6495,49 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/nested-clients@3.989.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
'@aws-sdk/core': 3.973.9
'@aws-sdk/middleware-host-header': 3.972.3
'@aws-sdk/middleware-logger': 3.972.3
'@aws-sdk/middleware-recursion-detection': 3.972.3
'@aws-sdk/middleware-user-agent': 3.972.9
'@aws-sdk/region-config-resolver': 3.972.3
'@aws-sdk/types': 3.973.1
'@aws-sdk/util-endpoints': 3.989.0
'@aws-sdk/util-user-agent-browser': 3.972.3
'@aws-sdk/util-user-agent-node': 3.972.7
'@smithy/config-resolver': 4.4.6
'@smithy/core': 3.23.0
'@smithy/fetch-http-handler': 5.3.9
'@smithy/hash-node': 4.2.8
'@smithy/invalid-dependency': 4.2.8
'@smithy/middleware-content-length': 4.2.8
'@smithy/middleware-endpoint': 4.4.14
'@smithy/middleware-retry': 4.4.31
'@smithy/middleware-serde': 4.2.9
'@smithy/middleware-stack': 4.2.8
'@smithy/node-config-provider': 4.3.8
'@smithy/node-http-handler': 4.4.10
'@smithy/protocol-http': 5.3.8
'@smithy/smithy-client': 4.11.3
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-base64': 4.3.0
'@smithy/util-body-length-browser': 4.2.0
'@smithy/util-body-length-node': 4.2.1
'@smithy/util-defaults-mode-browser': 4.3.30
'@smithy/util-defaults-mode-node': 4.2.33
'@smithy/util-endpoints': 3.2.8
'@smithy/util-middleware': 4.2.8
'@smithy/util-retry': 4.2.8
'@smithy/util-utf8': 4.2.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/region-config-resolver@3.972.3':
dependencies:
'@aws-sdk/types': 3.973.1
@@ -6269,6 +6558,18 @@ snapshots:
transitivePeerDependencies:
- aws-crt
'@aws-sdk/token-providers@3.989.0':
dependencies:
'@aws-sdk/core': 3.973.9
'@aws-sdk/nested-clients': 3.989.0
'@aws-sdk/types': 3.973.1
'@smithy/property-provider': 4.2.8
'@smithy/shared-ini-file-loader': 4.4.3
'@smithy/types': 4.12.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
'@aws-sdk/types@3.973.1':
dependencies:
'@smithy/types': 4.12.0
@@ -6282,6 +6583,14 @@ snapshots:
'@smithy/util-endpoints': 3.2.8
tslib: 2.8.1
'@aws-sdk/util-endpoints@3.989.0':
dependencies:
'@aws-sdk/types': 3.973.1
'@smithy/types': 4.12.0
'@smithy/url-parser': 4.2.8
'@smithy/util-endpoints': 3.2.8
tslib: 2.8.1
'@aws-sdk/util-format-url@3.972.3':
dependencies:
'@aws-sdk/types': 3.973.1
@@ -6308,6 +6617,14 @@ snapshots:
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/util-user-agent-node@3.972.7':
dependencies:
'@aws-sdk/middleware-user-agent': 3.972.9
'@aws-sdk/types': 3.973.1
'@smithy/node-config-provider': 4.3.8
'@smithy/types': 4.12.0
tslib: 2.8.1
'@aws-sdk/xml-builder@3.972.4':
dependencies:
'@smithy/types': 4.12.0
@@ -6751,12 +7068,6 @@ snapshots:
'@img/sharp-win32-x64@0.34.5':
optional: true
'@isaacs/balanced-match@4.0.1': {}
'@isaacs/brace-expansion@5.0.1':
dependencies:
'@isaacs/balanced-match': 4.0.1
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
@@ -6766,6 +7077,8 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
'@isaacs/cliui@9.0.0': {}
'@isaacs/fs-minipass@4.0.1':
dependencies:
minipass: 7.1.2
@@ -6949,9 +7262,9 @@ snapshots:
std-env: 3.10.0
yoctocolors: 2.1.2
'@mariozechner/pi-agent-core@0.52.9(ws@8.19.0)(zod@4.3.6)':
'@mariozechner/pi-agent-core@0.52.10(ws@8.19.0)(zod@4.3.6)':
dependencies:
'@mariozechner/pi-ai': 0.52.9(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-ai': 0.52.10(ws@8.19.0)(zod@4.3.6)
transitivePeerDependencies:
- '@modelcontextprotocol/sdk'
- aws-crt
@@ -6961,10 +7274,10 @@ snapshots:
- ws
- zod
'@mariozechner/pi-ai@0.52.9(ws@8.19.0)(zod@4.3.6)':
'@mariozechner/pi-ai@0.52.10(ws@8.19.0)(zod@4.3.6)':
dependencies:
'@anthropic-ai/sdk': 0.73.0(zod@4.3.6)
'@aws-sdk/client-bedrock-runtime': 3.988.0
'@aws-sdk/client-bedrock-runtime': 3.989.0
'@google/genai': 1.41.0
'@mistralai/mistralai': 1.10.0
'@sinclair/typebox': 0.34.48
@@ -6985,22 +7298,22 @@ snapshots:
- ws
- zod
'@mariozechner/pi-coding-agent@0.52.9(ws@8.19.0)(zod@4.3.6)':
'@mariozechner/pi-coding-agent@0.52.10(ws@8.19.0)(zod@4.3.6)':
dependencies:
'@mariozechner/jiti': 2.6.5
'@mariozechner/pi-agent-core': 0.52.9(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-ai': 0.52.9(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-tui': 0.52.9
'@mariozechner/pi-agent-core': 0.52.10(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-ai': 0.52.10(ws@8.19.0)(zod@4.3.6)
'@mariozechner/pi-tui': 0.52.10
'@silvia-odwyer/photon-node': 0.3.4
chalk: 5.6.2
cli-highlight: 2.1.11
diff: 8.0.3
file-type: 21.3.0
glob: 13.0.2
glob: 13.0.3
hosted-git-info: 9.0.2
ignore: 7.0.5
marked: 15.0.12
minimatch: 10.1.2
minimatch: 10.2.0
proper-lockfile: 4.1.2
yaml: 2.8.2
optionalDependencies:
@@ -7014,7 +7327,7 @@ snapshots:
- ws
- zod
'@mariozechner/pi-tui@0.52.9':
'@mariozechner/pi-tui@0.52.10':
dependencies:
'@types/mime-types': 2.1.4
chalk: 5.6.2
@@ -8961,6 +9274,10 @@ snapshots:
balanced-match@1.0.2: {}
balanced-match@4.0.2:
dependencies:
jackspeak: 4.2.3
base64-js@1.5.1: {}
basic-auth@2.0.1:
@@ -9022,6 +9339,10 @@ snapshots:
dependencies:
balanced-match: 1.0.2
brace-expansion@5.0.2:
dependencies:
balanced-match: 4.0.2
browser-or-node@1.3.0: {}
buffer-equal-constant-time@1.0.1: {}
@@ -9649,9 +9970,9 @@ snapshots:
package-json-from-dist: 1.0.1
path-scurry: 1.11.1
glob@13.0.2:
glob@13.0.3:
dependencies:
minimatch: 10.1.2
minimatch: 10.2.0
minipass: 7.1.2
path-scurry: 2.0.1
@@ -9912,6 +10233,10 @@ snapshots:
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
jackspeak@4.2.3:
dependencies:
'@isaacs/cliui': 9.0.0
jiti@2.6.1: {}
jose@4.15.9: {}
@@ -10225,9 +10550,9 @@ snapshots:
minimalistic-assert@1.0.1: {}
minimatch@10.1.2:
minimatch@10.2.0:
dependencies:
'@isaacs/brace-expansion': 5.0.1
brace-expansion: 5.0.2
minimatch@9.0.5:
dependencies:

View File

@@ -135,43 +135,6 @@ describe("resolveModel", () => {
expect(result.model?.id).toBe("missing-model");
});
it("builds an openai-codex fallback for gpt-5.3-codex", () => {
const templateModel = {
id: "gpt-5.2-codex",
name: "GPT-5.2 Codex",
provider: "openai-codex",
api: "openai-codex-responses",
baseUrl: "https://chatgpt.com/backend-api",
reasoning: true,
input: ["text", "image"] as const,
cost: { input: 1.75, output: 14, cacheRead: 0.175, cacheWrite: 0 },
contextWindow: 272000,
maxTokens: 128000,
};
vi.mocked(discoverModels).mockReturnValue({
find: vi.fn((provider: string, modelId: string) => {
if (provider === "openai-codex" && modelId === "gpt-5.2-codex") {
return templateModel;
}
return null;
}),
} as unknown as ReturnType<typeof discoverModels>);
const result = resolveModel("openai-codex", "gpt-5.3-codex", "/tmp/agent");
expect(result.error).toBeUndefined();
expect(result.model).toMatchObject({
provider: "openai-codex",
id: "gpt-5.3-codex",
api: "openai-codex-responses",
baseUrl: "https://chatgpt.com/backend-api",
reasoning: true,
contextWindow: 272000,
maxTokens: 128000,
});
});
it("builds an anthropic forward-compat fallback for claude-opus-4-6", () => {
const templateModel = {
id: "claude-opus-4-5",
@@ -242,71 +205,9 @@ describe("resolveModel", () => {
});
});
it("builds a zai forward-compat fallback for glm-5", () => {
const templateModel = {
id: "glm-4.7",
name: "GLM-4.7",
provider: "zai",
api: "openai-completions",
baseUrl: "https://api.z.ai/api/paas/v4",
reasoning: true,
input: ["text"] as const,
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 200000,
maxTokens: 131072,
};
vi.mocked(discoverModels).mockReturnValue({
find: vi.fn((provider: string, modelId: string) => {
if (provider === "zai" && modelId === "glm-4.7") {
return templateModel;
}
return null;
}),
} as unknown as ReturnType<typeof discoverModels>);
const result = resolveModel("zai", "glm-5", "/tmp/agent");
expect(result.error).toBeUndefined();
expect(result.model).toMatchObject({
provider: "zai",
id: "glm-5",
api: "openai-completions",
baseUrl: "https://api.z.ai/api/paas/v4",
reasoning: true,
});
});
it("keeps unknown-model errors for non-gpt-5 openai-codex ids", () => {
const result = resolveModel("openai-codex", "gpt-4.1-mini", "/tmp/agent");
expect(result.model).toBeUndefined();
expect(result.error).toBe("Unknown model: openai-codex/gpt-4.1-mini");
});
it("uses codex fallback even when openai-codex provider is configured", () => {
// This test verifies the ordering: codex fallback must fire BEFORE the generic providerCfg fallback.
// If ordering is wrong, the generic fallback would use api: "openai-responses" (the default)
// instead of "openai-codex-responses".
const cfg: OpenClawConfig = {
models: {
providers: {
"openai-codex": {
baseUrl: "https://custom.example.com",
// No models array, or models without gpt-5.3-codex
},
},
},
} as OpenClawConfig;
vi.mocked(discoverModels).mockReturnValue({
find: vi.fn(() => null),
} as unknown as ReturnType<typeof discoverModels>);
const result = resolveModel("openai-codex", "gpt-5.3-codex", "/tmp/agent", cfg);
expect(result.error).toBeUndefined();
expect(result.model?.api).toBe("openai-codex-responses");
expect(result.model?.id).toBe("gpt-5.3-codex");
expect(result.model?.provider).toBe("openai-codex");
});
});

View File

@@ -19,56 +19,12 @@ type InlineProviderConfig = {
models?: ModelDefinitionConfig[];
};
const OPENAI_CODEX_GPT_53_MODEL_ID = "gpt-5.3-codex";
const OPENAI_CODEX_TEMPLATE_MODEL_IDS = ["gpt-5.2-codex"] as const;
// pi-ai's built-in Anthropic catalog can lag behind OpenClaw's defaults/docs.
// Add forward-compat fallbacks for known-new IDs by cloning an older template model.
const ANTHROPIC_OPUS_46_MODEL_ID = "claude-opus-4-6";
const ANTHROPIC_OPUS_46_DOT_MODEL_ID = "claude-opus-4.6";
const ANTHROPIC_OPUS_TEMPLATE_MODEL_IDS = ["claude-opus-4-5", "claude-opus-4.5"] as const;
function resolveOpenAICodexGpt53FallbackModel(
provider: string,
modelId: string,
modelRegistry: ModelRegistry,
): Model<Api> | undefined {
const normalizedProvider = normalizeProviderId(provider);
const trimmedModelId = modelId.trim();
if (normalizedProvider !== "openai-codex") {
return undefined;
}
if (trimmedModelId.toLowerCase() !== OPENAI_CODEX_GPT_53_MODEL_ID) {
return undefined;
}
for (const templateId of OPENAI_CODEX_TEMPLATE_MODEL_IDS) {
const template = modelRegistry.find(normalizedProvider, templateId) as Model<Api> | null;
if (!template) {
continue;
}
return normalizeModelCompat({
...template,
id: trimmedModelId,
name: trimmedModelId,
} as Model<Api>);
}
return normalizeModelCompat({
id: trimmedModelId,
name: trimmedModelId,
api: "openai-codex-responses",
provider: normalizedProvider,
baseUrl: "https://chatgpt.com/backend-api",
reasoning: true,
input: ["text", "image"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: DEFAULT_CONTEXT_TOKENS,
maxTokens: DEFAULT_CONTEXT_TOKENS,
} as Model<Api>);
}
function resolveAnthropicOpus46ForwardCompatModel(
provider: string,
modelId: string,
@@ -114,51 +70,6 @@ function resolveAnthropicOpus46ForwardCompatModel(
return undefined;
}
// Z.ai's GLM-5 may not be present in pi-ai's built-in model catalog yet.
// When a user configures zai/glm-5 without a models.json entry, clone glm-4.7 as a forward-compat fallback.
const ZAI_GLM5_MODEL_ID = "glm-5";
const ZAI_GLM5_TEMPLATE_MODEL_IDS = ["glm-4.7"] as const;
function resolveZaiGlm5ForwardCompatModel(
provider: string,
modelId: string,
modelRegistry: ModelRegistry,
): Model<Api> | undefined {
if (normalizeProviderId(provider) !== "zai") {
return undefined;
}
const trimmed = modelId.trim();
const lower = trimmed.toLowerCase();
if (lower !== ZAI_GLM5_MODEL_ID && !lower.startsWith(`${ZAI_GLM5_MODEL_ID}-`)) {
return undefined;
}
for (const templateId of ZAI_GLM5_TEMPLATE_MODEL_IDS) {
const template = modelRegistry.find("zai", templateId) as Model<Api> | null;
if (!template) {
continue;
}
return normalizeModelCompat({
...template,
id: trimmed,
name: trimmed,
reasoning: true,
} as Model<Api>);
}
return normalizeModelCompat({
id: trimmed,
name: trimmed,
api: "openai-completions",
provider: "zai",
reasoning: true,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: DEFAULT_CONTEXT_TOKENS,
maxTokens: DEFAULT_CONTEXT_TOKENS,
} as Model<Api>);
}
// google-antigravity's model catalog in pi-ai can lag behind the actual platform.
// When a google-antigravity model ID contains "opus-4-6" (or "opus-4.6") but isn't
// in the registry yet, clone the opus-4-5 template so the correct api
@@ -260,17 +171,6 @@ export function resolveModel(
modelRegistry,
};
}
// Codex gpt-5.3 forward-compat fallback must be checked BEFORE the generic providerCfg fallback.
// Otherwise, if cfg.models.providers["openai-codex"] is configured, the generic fallback fires
// with api: "openai-responses" instead of the correct "openai-codex-responses".
const codexForwardCompat = resolveOpenAICodexGpt53FallbackModel(
provider,
modelId,
modelRegistry,
);
if (codexForwardCompat) {
return { model: codexForwardCompat, authStorage, modelRegistry };
}
const anthropicForwardCompat = resolveAnthropicOpus46ForwardCompatModel(
provider,
modelId,
@@ -287,10 +187,6 @@ export function resolveModel(
if (antigravityForwardCompat) {
return { model: antigravityForwardCompat, authStorage, modelRegistry };
}
const zaiForwardCompat = resolveZaiGlm5ForwardCompatModel(provider, modelId, modelRegistry);
if (zaiForwardCompat) {
return { model: zaiForwardCompat, authStorage, modelRegistry };
}
const providerCfg = providers[provider];
if (providerCfg || modelId.startsWith("mock-")) {
const fallbackModel: Model<Api> = normalizeModelCompat({

View File

@@ -154,7 +154,7 @@ describe("directive behavior", () => {
const texts = (Array.isArray(res) ? res : [res]).map((entry) => entry?.text).filter(Boolean);
expect(texts).toContain(
'Thinking level "xhigh" is only supported for openai/gpt-5.2, openai-codex/gpt-5.3-codex, openai-codex/gpt-5.2-codex, openai-codex/gpt-5.1-codex, github-copilot/gpt-5.2-codex or github-copilot/gpt-5.2.',
'Thinking level "xhigh" is only supported for openai/gpt-5.2, openai-codex/gpt-5.3-codex, openai-codex/gpt-5.3-codex-spark, openai-codex/gpt-5.2-codex, openai-codex/gpt-5.1-codex, github-copilot/gpt-5.2-codex or github-copilot/gpt-5.2.',
);
});
});

View File

@@ -44,6 +44,7 @@ describe("listThinkingLevels", () => {
it("includes xhigh for codex models", () => {
expect(listThinkingLevels(undefined, "gpt-5.2-codex")).toContain("xhigh");
expect(listThinkingLevels(undefined, "gpt-5.3-codex")).toContain("xhigh");
expect(listThinkingLevels(undefined, "gpt-5.3-codex-spark")).toContain("xhigh");
});
it("includes xhigh for openai gpt-5.2", () => {

View File

@@ -24,6 +24,7 @@ export function isBinaryThinkingProvider(provider?: string | null): boolean {
export const XHIGH_MODEL_REFS = [
"openai/gpt-5.2",
"openai-codex/gpt-5.3-codex",
"openai-codex/gpt-5.3-codex-spark",
"openai-codex/gpt-5.2-codex",
"openai-codex/gpt-5.1-codex",
"github-copilot/gpt-5.2-codex",