w-dispatch-ai 1.0.39 → 1.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -1
- package/dist/w-dispatch-ai.umd.js +2 -2
- package/dist/w-dispatch-ai.umd.js.map +1 -1
- package/docs/WDispatchAi.mjs.html +1 -1
- package/docs/adapters.mjs.html +1 -1
- package/docs/budgetFor.mjs.html +1 -1
- package/docs/buildValidator.mjs.html +1 -1
- package/docs/castPintOr.mjs.html +1 -1
- package/docs/checkTruncation.mjs.html +1 -1
- package/docs/describeNonJsonBody.mjs.html +1 -1
- package/docs/dfTimeoutMs.mjs.html +1 -1
- package/docs/dispatchAi.mjs.html +1 -1
- package/docs/dispatchAiFallback.mjs.html +1 -1
- package/docs/dispatchAiWkf.mjs.html +1 -1
- package/docs/dispatchAntigravity.mjs.html +1 -1
- package/docs/dispatchApiOpenaiCompat.mjs.html +1 -1
- package/docs/dispatchApiOpenaiResponses.mjs.html +1 -1
- package/docs/dispatchApiTypesafeSystemone.mjs.html +1 -1
- package/docs/dispatchClaude.mjs.html +1 -1
- package/docs/dispatchCodex.mjs.html +2 -2
- package/docs/dispatchOpencode.mjs.html +1 -1
- package/docs/getCliArgs.mjs.html +1 -1
- package/docs/getErrorResult.mjs.html +1 -1
- package/docs/getErrorType.mjs.html +1 -1
- package/docs/global.html +2 -2
- package/docs/index.html +1 -1
- package/docs/quota_dfQuotaTimeoutMs.mjs.html +1 -1
- package/docs/quota_fetchQuotaJson.mjs.html +1 -1
- package/docs/quota_fromCodexUsageHttp.mjs.html +1 -1
- package/docs/quota_getQuotaAntigravity.mjs.html +1 -1
- package/docs/quota_getQuotaClaude.mjs.html +1 -1
- package/docs/quota_getQuotaCodex.mjs.html +1 -1
- package/docs/quota_readJsonOrNull.mjs.html +1 -1
- package/docs/quota_toQuotaLabel.mjs.html +1 -1
- package/docs/quota_toQuotaResult.mjs.html +1 -1
- package/docs/quota_toQuotaScopedLabel.mjs.html +1 -1
- package/docs/quota_toQuotaWindow.mjs.html +1 -1
- package/docs/readEnvFile.mjs.html +1 -1
- package/docs/resolveProviders.mjs.html +1 -1
- package/docs/wkf_callAiWithFallback.mjs.html +1 -1
- package/docs/wkf_createFileStore.mjs.html +1 -1
- package/docs/wkf_createUsageCounter.mjs.html +1 -1
- package/docs/wkf_extractJsonLoose.mjs.html +1 -1
- package/docs/wkf_noSideEffectPrefix.mjs.html +1 -1
- package/docs/wkf_runFanout.mjs.html +1 -1
- package/docs/wkf_runFanoutPipeline.mjs.html +1 -1
- package/docs/wkf_runRolePipeline.mjs.html +1 -1
- package/docs/wkf_salvageTruncatedArray.mjs.html +1 -1
- package/package.json +1 -1
- package/src/dispatchCodex.mjs +1 -1
- package/src/providers.mjs +49 -13
- package/test/unit-providers.test.mjs +37 -0
package/src/providers.mjs
CHANGED
|
@@ -194,6 +194,26 @@ let OC_READONLY = { edit: 'deny', bash: 'ask' }
|
|
|
194
194
|
let CLAUDE_READONLY = ['--tools', 'Read,Glob,Grep', '--strict-mcp-config']
|
|
195
195
|
|
|
196
196
|
|
|
197
|
+
//各條目之思考強度(單一來源, 2026-09-30使用者指示一律high): 各家參數不同, 條目引用下列常數而不手寫。
|
|
198
|
+
// claude --effort(low/medium/high/xhigh/max): 未給時-p實測為medium(Claude Code 2.1.285, session紀錄之effort欄)。
|
|
199
|
+
// codex --config model_reasoning_effort: 未給時沿用執行機之~/.codex/config.toml(本機為high), 再無則為模型預設
|
|
200
|
+
// (app-server model/list之defaultReasoningEffort, gpt-6.1-sol為low)——明給令條目不隨安裝機之設定而變;
|
|
201
|
+
// 同日實測--config覆寫優先於config.toml(給low時session記為low)。
|
|
202
|
+
// opencode --variant: 僅部分模型有檔位, 以`opencode models <provider> --verbose`之variants查(同日opencode 1.18.33:
|
|
203
|
+
// muse-spark-1.2/1.3與space-bunny有high; big-pickle、mimo無檔位; agnes-ai、poolside為自訂provider亦無),
|
|
204
|
+
// 無檔位之條目不帶。同日實測space-bunny之variant low/high推理token為18/71, opencode.db之訊息記錄variant。
|
|
205
|
+
// REST body.reasoning_effort: 僅zen:space-bunny-free帶——opencode模型目錄宣告其high檔即{reasoningEffort:'high'}
|
|
206
|
+
// (@ai-sdk/openai-compatible轉為此欄), 與oc:版同參數。agnes接受此欄但同日兩題各兩輪推理token無一致差異,
|
|
207
|
+
// 視為未生效故不帶(其預設即會思考, usage可見推理token)。poolside之思考為開關(chat_template_kwargs.enable_thinking)
|
|
208
|
+
// 而非檔位, 同日由關改開(見該條); jev(systemone)為決策模型無此概念。
|
|
209
|
+
// agy 以模型slug之檔位表示(gemini-3.8-flash-high), 不另帶--effort(與slug檔位不一致時agy報conflicts)。
|
|
210
|
+
// 注意: 條目覆寫extraArgs時須一併帶上本常數(與防寫常數), 否則回退各CLI之預設強度。
|
|
211
|
+
let EFFORT = 'high'
|
|
212
|
+
let CLAUDE_EFFORT = ['--effort', EFFORT]
|
|
213
|
+
let CODEX_EFFORT = ['--config', `model_reasoning_effort="${EFFORT}"`]
|
|
214
|
+
let OC_EFFORT = ['--variant', EFFORT]
|
|
215
|
+
|
|
216
|
+
|
|
197
217
|
let providers = [
|
|
198
218
|
|
|
199
219
|
//cli版
|
|
@@ -246,7 +266,10 @@ let providers = [
|
|
|
246
266
|
config: {
|
|
247
267
|
permission: OC_READONLY,
|
|
248
268
|
},
|
|
249
|
-
|
|
269
|
+
extraArgs: OC_EFFORT,
|
|
270
|
+
//2026-09-03實測8.1s(opencode CLI 1.18.27); 同模型另有zen:REST版, 額度池與故障域各自獨立。
|
|
271
|
+
//2026-09-30(opencode 1.18.33)連3次2.0s即失敗: 伺服器回UnknownError「Unexpected server error」, 帶不帶--variant皆同,
|
|
272
|
+
//同時1.3正常——屬上游暫時故障, 依套件哲學保留不移除(恢復之偵測即下次再打)
|
|
250
273
|
},
|
|
251
274
|
{
|
|
252
275
|
id: 'oc:opencode/muse-spark-1.3-contributor-free',
|
|
@@ -257,6 +280,7 @@ let providers = [
|
|
|
257
280
|
config: {
|
|
258
281
|
permission: OC_READONLY,
|
|
259
282
|
},
|
|
283
|
+
extraArgs: OC_EFFORT,
|
|
260
284
|
//2026-09-03實測6.1s(opencode CLI 1.18.27)。註: 同日同模型走zen REST回HTTP 500,
|
|
261
285
|
//僅CLI路徑可用——同模型不同路徑屬不同供應商之實例(故未增zen:對應條目)
|
|
262
286
|
},
|
|
@@ -294,6 +318,7 @@ let providers = [
|
|
|
294
318
|
config: {
|
|
295
319
|
permission: OC_READONLY,
|
|
296
320
|
},
|
|
321
|
+
extraArgs: OC_EFFORT,
|
|
297
322
|
//2026-09-24新增(官方v1/v2文件、CLI清單與/zen/v1/models皆有; 〈Pricing〉全Free, 限時免費之stealth推理模型,
|
|
298
323
|
//context 1M、可輸入圖片與影片)。匿名CLI實測(opencode 1.18.32): 簡答8.1s、推理題34.9s答對、
|
|
299
324
|
//read工具讀相對路徑13.2s正確、要求寫檔被OC_READONLY擋下未落地。官方〈Privacy〉載明其供應商零保留
|
|
@@ -312,16 +337,18 @@ let providers = [
|
|
|
312
337
|
},
|
|
313
338
|
//claude/codex各兩條: 在前者為預設(全取遞補時先試), 在後者為較強之新模型(2026-09-23使用者指示)
|
|
314
339
|
{
|
|
315
|
-
id: 'claude:sonnet',
|
|
340
|
+
id: 'claude:sonnet', //當前為5.5
|
|
316
341
|
model: 'sonnet',
|
|
317
342
|
kind: 'claude',
|
|
318
|
-
extraArgs: CLAUDE_READONLY,
|
|
343
|
+
extraArgs: [...CLAUDE_READONLY, ...CLAUDE_EFFORT],
|
|
344
|
+
//官方2026-09-28發布Sonnet 5.5; 2026-09-30於Claude Code 2.1.285以modelUsage實測別名已指向claude-sonnet-5-5。
|
|
345
|
+
//用別名則新版Sonnet發布即自動切換(與opus-5.5寫全名之取捨見該條)
|
|
319
346
|
},
|
|
320
347
|
{
|
|
321
348
|
id: 'claude:opus-5.5',
|
|
322
349
|
model: 'claude-opus-5-5',
|
|
323
350
|
kind: 'claude',
|
|
324
|
-
extraArgs: CLAUDE_READONLY,
|
|
351
|
+
extraArgs: [...CLAUDE_READONLY, ...CLAUDE_EFFORT],
|
|
325
352
|
//2026-09-23新增Opus 5.5(官方2026-09-22發布, API id claude-opus-5-5): Claude Code 2.1.280實測4.9~5.1s,
|
|
326
353
|
//以--output-format json之modelUsage確認實際服務模型為claude-opus-5-5。
|
|
327
354
|
//刻意寫全名而非別名'opus': 別名當下雖同樣指向5.5(同日實測), 但日後新版Opus發布時會無聲切換,
|
|
@@ -332,16 +359,20 @@ let providers = [
|
|
|
332
359
|
model: 'gpt-5.6-luna',
|
|
333
360
|
kind: 'codex',
|
|
334
361
|
sandbox: 'read-only',
|
|
362
|
+
extraArgs: CODEX_EFFORT,
|
|
335
363
|
},
|
|
336
364
|
{
|
|
337
|
-
id: 'codex:gpt-6-sol',
|
|
338
|
-
model: 'gpt-6-sol',
|
|
365
|
+
id: 'codex:gpt-6.1-sol',
|
|
366
|
+
model: 'gpt-6.1-sol',
|
|
339
367
|
kind: 'codex',
|
|
340
368
|
sandbox: 'read-only',
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
//
|
|
344
|
-
|
|
369
|
+
extraArgs: CODEX_EFFORT,
|
|
370
|
+
//2026-09-30以GPT-6.1 Sol取代GPT-6 Sol(使用者指示; 前者2026-09-23收錄): 官方2026-09-29發布, Codex對Plus/Pro等開放;
|
|
371
|
+
//Codex CLI 0.159.2之app-server model/list已列且為該帳號預設模型(isDefault), 實測8.6s, session紀錄確認服務模型為gpt-6.1-sol;
|
|
372
|
+
//金絲雀實測唯讀沙箱擋下寫檔(回報沙箱唯讀、檔案未落地)。
|
|
373
|
+
//寫全名而非別名: Codex無「最新版sol」之別名——官方Models文件未載別名, model/list各筆亦無別名欄位且upgrade為null;
|
|
374
|
+
//不給model則改用執行機config.toml之model(本機實測不帶-m時跑gpt-5.6-sol)或官方推薦預設(不限sol系), 故新版發布時手動換。
|
|
375
|
+
//若本機為較舊之codex而清單無此模型, 先執行`codex update`
|
|
345
376
|
},
|
|
346
377
|
|
|
347
378
|
//api版
|
|
@@ -385,9 +416,13 @@ let providers = [
|
|
|
385
416
|
envVar: 'POOLSIDE_KEYS',
|
|
386
417
|
baseURL: 'https://inference.poolside.ai/v1',
|
|
387
418
|
body: {
|
|
388
|
-
max_tokens:
|
|
389
|
-
chat_template_kwargs: { enable_thinking:
|
|
419
|
+
max_tokens: 32768,
|
|
420
|
+
chat_template_kwargs: { enable_thinking: true },
|
|
390
421
|
},
|
|
422
|
+
//思考為開關而非檔位: 2026-09-30依「思考強度一律high」由false改true(原false無紀錄說明)。同日實測(第1把金鑰):
|
|
423
|
+
//不帶此欄即為開啟(推理829、27.6s); false時推理0、3.8s但一題正整數邊長矩形題答錯(12,3,6), true時答對(3,3,3、20.7s)。
|
|
424
|
+
//reasoning_effort於false時HTTP 400、true時接受但推理token無一致差異, 故不帶。開思考後推理token計入max_tokens,
|
|
425
|
+
//依README「推理模型請放寬body.max_tokens」由8192改32768(同日實測接受, 列10縣市題用538)
|
|
391
426
|
},
|
|
392
427
|
{
|
|
393
428
|
id: 'zen:space-bunny-free',
|
|
@@ -395,11 +430,12 @@ let providers = [
|
|
|
395
430
|
kind: 'api-openai-compat',
|
|
396
431
|
envVar: 'OPENCODE_KEYS',
|
|
397
432
|
baseURL: 'https://opencode.ai/zen/v1',
|
|
398
|
-
body: { max_tokens: 32768 },
|
|
433
|
+
body: { max_tokens: 32768, reasoning_effort: EFFORT },
|
|
399
434
|
//2026-09-24新增: 對話型免費模型中少數REST可通者(免費層閘門未套用, 見檔頭; 例外可能隨時收回)——
|
|
400
435
|
//匿名1.9s、第1把金鑰2.0s皆200。max_tokens刻意不用zen條目慣例之8192: 此為推理模型, 推理token計入max_tokens,
|
|
401
436
|
//同日實測列10縣市一題即用5222(推理4849+正文373), 8192易截斷(轉接器遇截斷預設判失敗換家, 見checkTruncation.mjs);
|
|
402
437
|
//長文(README前8000字)摘要成JSON一題用3385(推理3045), 三題finish_reason皆stop, 故取32768留約6倍餘裕。
|
|
438
|
+
//2026-09-30加reasoning_effort(思考強度見EFFORT常數): 同日帶high列10縣市題用277(推理89)、6.6s、finish_reason為stop
|
|
403
439
|
},
|
|
404
440
|
|
|
405
441
|
]
|
|
@@ -109,4 +109,41 @@ describe('providers', function() {
|
|
|
109
109
|
assert.strict.deepEqual(r, rr)
|
|
110
110
|
})
|
|
111
111
|
|
|
112
|
+
it('思考強度一律high: claude、codex、antigravity條目必明給; opencode之--variant與REST之reasoning_effort帶則須為high, REST不得關閉思考', function() {
|
|
113
|
+
//未明給時claude回退-p預設(2026-09-30實測medium)、codex回退執行機之config.toml, 結果隨安裝機而異;
|
|
114
|
+
//opencode之variant與REST之reasoning_effort僅部分模型有(見providers.mjs之EFFORT常數), 故只檢「帶則為high」
|
|
115
|
+
let flagValues = (a, flag) => {
|
|
116
|
+
let arr = Array.isArray(a) ? a : []
|
|
117
|
+
let vs = []
|
|
118
|
+
for (let i = 0; i < arr.length - 1; i++) {
|
|
119
|
+
if (arr[i] === flag) {
|
|
120
|
+
vs.push(arr[i + 1])
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return vs
|
|
124
|
+
}
|
|
125
|
+
let isHigh = (p) => {
|
|
126
|
+
if (p.kind === 'claude') {
|
|
127
|
+
let vs = flagValues(p.extraArgs, '--effort')
|
|
128
|
+
return vs.length === 1 && vs[0] === 'high'
|
|
129
|
+
}
|
|
130
|
+
if (p.kind === 'codex') {
|
|
131
|
+
let vs = flagValues(p.extraArgs, '--config').filter((s) => /^model_reasoning_effort\s*=/.test(s))
|
|
132
|
+
return vs.length === 1 && vs[0] === 'model_reasoning_effort="high"'
|
|
133
|
+
}
|
|
134
|
+
if (p.kind === 'antigravity') {
|
|
135
|
+
return /-high$/.test(p.model) || p.effort === 'high' //檔位以slug或effort表示
|
|
136
|
+
}
|
|
137
|
+
if (p.kind === 'opencode') {
|
|
138
|
+
return flagValues(p.extraArgs, '--variant').every((v) => v === 'high')
|
|
139
|
+
}
|
|
140
|
+
let body = p.body || {}
|
|
141
|
+
let thinkingOff = !!body.chat_template_kwargs && body.chat_template_kwargs.enable_thinking === false
|
|
142
|
+
return (body.reasoning_effort === undefined || body.reasoning_effort === 'high') && !thinkingOff
|
|
143
|
+
}
|
|
144
|
+
let r = providers.map((p) => [p.id, isHigh(p)])
|
|
145
|
+
let rr = providers.map((p) => [p.id, true])
|
|
146
|
+
assert.strict.deepEqual(r, rr)
|
|
147
|
+
})
|
|
148
|
+
|
|
112
149
|
})
|