@futdevpro/fsm-dynamo 1.16.22 → 1.16.24
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/build/_modules/ai/_modules/anthropic/_collections/aai-models.const.d.ts.map +1 -1
- package/build/_modules/ai/_modules/anthropic/_collections/aai-models.const.js +7 -2
- package/build/_modules/ai/_modules/anthropic/_collections/aai-models.const.js.map +1 -1
- package/build/_modules/ai/_modules/google-ai/_collections/gai-models.const.d.ts.map +1 -1
- package/build/_modules/ai/_modules/google-ai/_collections/gai-models.const.js +24 -0
- package/build/_modules/ai/_modules/google-ai/_collections/gai-models.const.js.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_collections/oai-models.const.d.ts.map +1 -1
- package/build/_modules/ai/_modules/open-ai/_collections/oai-models.const.js +65 -18
- package/build/_modules/ai/_modules/open-ai/_collections/oai-models.const.js.map +1 -1
- package/package.json +1 -1
- package/scripts/_capture-out/ai-error-capture.json +310 -0
- package/scripts/ai-error-capture.js +166 -0
- package/scripts/ai-model-registry-check.js +132 -0
- package/src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts +7 -2
- package/src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts +24 -0
- package/src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts +67 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"aai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAiE7E,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAmE9C,CAAC"}
|
|
@@ -28,14 +28,19 @@ const AAI_OPUS_SETTINGS = {
|
|
|
28
28
|
unsupported: ['temperature', 'topP', 'topK'],
|
|
29
29
|
constraints: {
|
|
30
30
|
maxTokens: {
|
|
31
|
-
note: '
|
|
32
|
-
'
|
|
31
|
+
note: 'REQUIRED — empirically verified by live capture 2026-07-21: omitting it returns HTTP 400 ' +
|
|
32
|
+
'`{"type":"error","error":{"type":"invalid_request_error","message":"max_tokens: Field required"},"request_id":"req_..."}`. ' +
|
|
33
|
+
'The published docs do NOT state this, hence the capture. Per-model maximum varies (see `maxOutputTokens`), ' +
|
|
34
|
+
'so no global min/max is encoded.',
|
|
33
35
|
},
|
|
34
36
|
},
|
|
35
37
|
};
|
|
36
38
|
/**
|
|
37
39
|
* Sonnet / Haiku still ACCEPT the sampling params (only Opus 4.7+ rejects them).
|
|
38
40
|
*
|
|
41
|
+
* **`topK`: NINCS bound kodolva** — live capture 2026-07-21: a `top_k: -1` **HTTP 200-zal ATMENT**, tehat a
|
|
42
|
+
* szerver nem validalja alulrol. Egy kitalalt `min: 0` itt hibas clamp-et okozna.
|
|
43
|
+
*
|
|
39
44
|
* **Fontos provider-kulonbseg:** az Anthropic `temperature` maximuma **1.0**, NEM 2.0 mint az OpenAI-nal —
|
|
40
45
|
* egy OpenAI-nal ervenyes `temperature: 1.5` itt ervenytelen. A validator ezt most elkapja.
|
|
41
46
|
* `topP` / `topK`: az API-referencia NEM ad meg szamszeru hatarokat → szandekosan nem kodolunk bele semmit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AACpE,2EAAuE;AAGvE,6DAA0D;AAE1D;;;;;;;;;;;;GAYG;AAEH;;;;;GAKG;AACH,MAAM,iBAAiB,GAAgC;IACrD,SAAS,EAAE,CAAE,WAAW,CAAE;IAC1B,WAAW,EAAE,CAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAE;IAC9C,WAAW,EAAE;QACX,SAAS,EAAE;YACT,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"aai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AACpE,2EAAuE;AAGvE,6DAA0D;AAE1D;;;;;;;;;;;;GAYG;AAEH;;;;;GAKG;AACH,MAAM,iBAAiB,GAAgC;IACrD,SAAS,EAAE,CAAE,WAAW,CAAE;IAC1B,WAAW,EAAE,CAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAE;IAC9C,WAAW,EAAE;QACX,SAAS,EAAE;YACT,IAAI,EAAE,2FAA2F;gBAC/F,6HAA6H;gBAC7H,6GAA6G;gBAC7G,kCAAkC;SACrC;KACF;CACF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,qBAAqB,GAAgC;IACzD,SAAS,EAAE,CAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAE;IACjD,WAAW,EAAE,CAAE,MAAM,CAAE;IACvB,WAAW,EAAE;QACX,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,2FAA2F;gBAC/F,wEAAwE;SAC3E;QACD,SAAS,EAAE;YACT,IAAI,EAAE,oGAAoG;gBACxG,wGAAwG;SAC3G;KACF;CACF,CAAC;AACW,QAAA,eAAe,GAAwB;IAClD;QACE,EAAE,EAAE,+BAAc,CAAC,eAAe;QAClC,QAAQ,EAAE,mCAAgB,CAAC,SAAS;QACpC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,iBAAiB;QACjC,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,OAAO;QACxB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;IACD;QACE,EAAE,EAAE,+BAAc,CAAC,iBAAiB;QACpC,QAAQ,EAAE,mCAAgB,CAAC,SAAS;QACpC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,mBAAmB;QAChC,IAAI,EAAE,QAAQ;QACd,cAAc,EAAE,qBAAqB;QACrC,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;IACD;QACE,EAAE,EAAE,+BAAc,CAAC,gBAAgB;QACnC,QAAQ,EAAE,mCAAgB,CAAC,SAAS;QACpC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,qBAAqB;QACrC,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"gai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAuE7E,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAuF9C,CAAC"}
|
|
@@ -26,6 +26,30 @@ const GAI_CHAT_SETTINGS = {
|
|
|
26
26
|
supported: ['temperature', 'maxTokens', 'topP'],
|
|
27
27
|
unsupported: ['frequencyPenalty', 'presencePenalty'],
|
|
28
28
|
extraParams: ['topK', 'candidateCount', 'responseSchema', 'thinkingConfig', 'toolConfig'],
|
|
29
|
+
// A Gemini-doksi NEM publikal szamhatarokat — az alabbiakat SZANDEKOSAN kivaltott hibauzenetekbol
|
|
30
|
+
// mertuk ki (live capture 2026-07-21). Ez volt az EGYETLEN mod verifikalt bound-okhoz jutni.
|
|
31
|
+
constraints: {
|
|
32
|
+
temperature: {
|
|
33
|
+
min: 0,
|
|
34
|
+
max: 2,
|
|
35
|
+
note: 'Capture 2026-07-21: "temperature must be in the range [0.0, 2.0]." — azonos az OpenAI-jal, ' +
|
|
36
|
+
'és NEM az Anthropic 1.0-s plafonjával.',
|
|
37
|
+
},
|
|
38
|
+
topP: {
|
|
39
|
+
min: 0,
|
|
40
|
+
max: 1,
|
|
41
|
+
note: 'Capture 2026-07-21: "top_p must be in the range [0.0, 1.0]."',
|
|
42
|
+
},
|
|
43
|
+
topK: {
|
|
44
|
+
min: 0,
|
|
45
|
+
note: 'Capture 2026-07-21: "top_k must be nonnegative." — felso hatart a szerver NEM kozolt, ezert nincs max.',
|
|
46
|
+
},
|
|
47
|
+
candidateCount: {
|
|
48
|
+
min: 1,
|
|
49
|
+
max: 8,
|
|
50
|
+
note: 'Capture 2026-07-21: "candidate_count must be in the range [1, 8]."',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
29
53
|
};
|
|
30
54
|
/**
|
|
31
55
|
* Mint {@link GAI_CHAT_SETTINGS}, de rogziti a Pro-preview NEM-nyilvanvalo default-jat: ha a hivas nem ad
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AACpE,2EAAuE;AAGvE,6DAA0D;AAE1D;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAgC;IACrD,SAAS,EAAE,CAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAE;IACjD,WAAW,EAAE,CAAE,kBAAkB,EAAE,iBAAiB,CAAE;IACtD,WAAW,EAAE,CAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAE;
|
|
1
|
+
{"version":3,"file":"gai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AACpE,2EAAuE;AAGvE,6DAA0D;AAE1D;;;;;;;;;GASG;AACH;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAgC;IACrD,SAAS,EAAE,CAAE,aAAa,EAAE,WAAW,EAAE,MAAM,CAAE;IACjD,WAAW,EAAE,CAAE,kBAAkB,EAAE,iBAAiB,CAAE;IACtD,WAAW,EAAE,CAAE,MAAM,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAE;IAC3F,kGAAkG;IAClG,6FAA6F;IAC7F,WAAW,EAAE;QACX,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,6FAA6F;gBACjG,wCAAwC;SAC3C;QACD,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,8DAA8D;SACrE;QACD,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,wGAAwG;SAC/G;QACD,cAAc,EAAE;YACd,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,oEAAoE;SAC3E;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,wBAAwB,GAAgC;IAC5D,GAAG,iBAAiB;IACpB,WAAW,EAAE;QACX,SAAS,EAAE;YACT,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,yHAAyH;SAChI;KACF;CACF,CAAC;AAEF,6FAA6F;AAC7F,MAAM,sBAAsB,GAAgC;IAC1D,WAAW,EAAE,CAAE,aAAa,EAAE,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,WAAW,CAAE;CAC3F,CAAC;AAEW,QAAA,eAAe,GAAwB;IAClD;QACE,EAAE,EAAE,+BAAc,CAAC,gBAAgB;QACnC,QAAQ,EAAE,mCAAgB,CAAC,MAAM;QACjC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,iBAAiB;QACjC,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;IACD;QACE,EAAE,EAAE,+BAAc,CAAC,sBAAsB;QACzC,QAAQ,EAAE,mCAAgB,CAAC,MAAM;QACjC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,0BAA0B;QACvC,IAAI,EAAE,KAAK;QACX,cAAc,EAAE,wBAAwB;QACxC,MAAM,EAAE,SAAS;QACjB,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;IACD;QACE,EAAE,EAAE,+BAAc,CAAC,qBAAqB;QACxC,QAAQ,EAAE,mCAAgB,CAAC,MAAM;QACjC,SAAS,EAAE,sCAAiB,CAAC,IAAI;QACjC,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE,iBAAiB;QACjC,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,MAAM;QACvB,YAAY,EAAE;YACZ,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB;KACF;IACD;QACE,EAAE,EAAE,+BAAc,CAAC,kBAAkB;QACrC,QAAQ,EAAE,mCAAgB,CAAC,MAAM;QACjC,SAAS,EAAE,sCAAiB,CAAC,SAAS;QACtC,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,sBAAsB;QACtC,aAAa,EAAE,KAAK;QACpB,YAAY,EAAE;YACZ,eAAe,EAAE,KAAK;YACtB,MAAM,EAAE,IAAI,EAAE,8CAA8C;YAC5D,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,KAAK;YACtB,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,KAAK;SACpB;KACF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"oai-models.const.d.ts","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AA0J7E,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAuP9C,CAAC"}
|
|
@@ -20,22 +20,49 @@ const oai_model_enum_1 = require("../_enums/oai-model.enum");
|
|
|
20
20
|
* `documentations/plans/ai-mocking-system/FR-048-LAYER-A.md`.
|
|
21
21
|
*/
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
* instead expose a `reasoningEffort` knob.
|
|
23
|
+
* Models that MEASURABLY reject the sampling params (HTTP 400) and expose `reasoningEffort` instead.
|
|
25
24
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
25
|
+
* **Live capture 2026-07-21** — confirmed rejecting: `gpt-5.5`, `o3-mini`, `o4-mini`. Two distinct
|
|
26
|
+
* semantics were observed and both mean "do not send it":
|
|
27
|
+
* - `unsupported_parameter` — the param is not supported at all (o3-mini).
|
|
28
|
+
* - `unsupported_value` — the param exists but only the default is allowed (gpt-5.5, o4-mini:
|
|
29
|
+
* "does not support 0.5 with this model. Only the default (1)").
|
|
30
|
+
*
|
|
31
|
+
* ⚠️ This list is NOT the whole `gpt-5.x` family — see {@link OAI_SAMPLING_ACCEPTED}. The earlier
|
|
32
|
+
* family-wide assumption (FR-047 `isReasoningModel` = `/^gpt-5/`) was falsified by the capture.
|
|
30
33
|
*/
|
|
31
|
-
const
|
|
34
|
+
const OAI_SAMPLING_REJECTED = {
|
|
32
35
|
supported: ['maxTokens'],
|
|
33
36
|
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty'],
|
|
34
37
|
extraParams: ['reasoningEffort'],
|
|
35
38
|
constraints: {
|
|
36
39
|
reasoningEffort: {
|
|
37
40
|
allowed: ['none', 'low', 'medium', 'high', 'xhigh'],
|
|
38
|
-
note: 'Reasoning-only knob
|
|
41
|
+
note: 'Reasoning-only knob. Source: FR-048 §Problem (2026-06-01); allowed-set not re-verified by capture.',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Same shape as {@link OAI_SAMPLING_REJECTED}, but **NOT verified by live capture** — kept on the
|
|
47
|
+
* conservative (reject) assumption.
|
|
48
|
+
*
|
|
49
|
+
* Applies to `gpt-5.5-pro` and `o3-pro` only: the pro-tier models were deliberately NOT probed (cost).
|
|
50
|
+
* (`gpt-5.4` was here too, until the 2026-07-21 probe showed it ACCEPTS — see OAI_SAMPLING_ACCEPTED.
|
|
51
|
+
* The emerging pattern is a GENERATION boundary, not "reasoning vs not": the whole 5.4 line accepts,
|
|
52
|
+
* 5.5 rejects. That makes the pro-tier behaviour genuinely unpredictable from the family name alone.)
|
|
53
|
+
*
|
|
54
|
+
* **Risk direction, stated honestly:** if such a model actually ACCEPTS the params, the reconciler
|
|
55
|
+
* drops them silently → the caller's temperature is quietly ignored. That is the milder failure vs.
|
|
56
|
+
* a hard 400, which is why the conservative side was chosen — but it IS an assumption, not a fact.
|
|
57
|
+
* Resolve by probing these three models (one cheap error-call each).
|
|
58
|
+
*/
|
|
59
|
+
const OAI_SAMPLING_UNVERIFIED = {
|
|
60
|
+
supported: ['maxTokens'],
|
|
61
|
+
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty'],
|
|
62
|
+
extraParams: ['reasoningEffort'],
|
|
63
|
+
constraints: {
|
|
64
|
+
reasoningEffort: {
|
|
65
|
+
note: 'UNVERIFIED (no live capture) — assumption inherited from the FR-047 family-wide rule.',
|
|
39
66
|
},
|
|
40
67
|
},
|
|
41
68
|
};
|
|
@@ -72,11 +99,31 @@ const OAI_CLASSIC_CHAT_SETTINGS = {
|
|
|
72
99
|
},
|
|
73
100
|
};
|
|
74
101
|
/**
|
|
75
|
-
*
|
|
102
|
+
* `gpt-5.4-mini` / `gpt-5.4-nano` — **MEASURABLY ACCEPT** all four sampling params.
|
|
103
|
+
*
|
|
104
|
+
* **Live capture 2026-07-21:** `temperature` / `topP` / `frequencyPenalty` / `presencePenalty` each
|
|
105
|
+
* returned HTTP 200 with `reasoning_tokens: 0`. They therefore behave like classic chat models, NOT
|
|
106
|
+
* like the rejecting reasoning models — despite matching the `/^gpt-5/` pattern that FR-047 used.
|
|
107
|
+
*
|
|
108
|
+
* `gpt-5.4` (base) was probed separately on 2026-07-21 and ALSO accepts (HTTP 200). The pattern is
|
|
109
|
+
* therefore a **generation boundary**, not "reasoning vs not": the whole 5.4 line accepts, 5.5 rejects.
|
|
110
|
+
* That is precisely why per-model data beats a family-wide regex.
|
|
111
|
+
* Bounds are the documented OpenAI ranges (see {@link OAI_CLASSIC_CHAT_SETTINGS}).
|
|
112
|
+
*/
|
|
113
|
+
const OAI_SAMPLING_ACCEPTED = {
|
|
114
|
+
...OAI_CLASSIC_CHAT_SETTINGS,
|
|
115
|
+
extraParams: ['reasoningEffort'],
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
76
119
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
120
|
+
* **Live capture 2026-07-21 — CORRECTION:** the sampling params are **NOT rejected**; sending
|
|
121
|
+
* `temperature` to `/v1/embeddings` returns **HTTP 200 and is silently ignored**. They are still listed
|
|
122
|
+
* under `unsupported` so the reconciler DROPS them (dropping a meaningless param is always safe and
|
|
123
|
+
* keeps requests clean) — but note that this does NOT mean the API would 400. The validator's
|
|
124
|
+
* `unsupported_parameter` error for these is therefore stricter than the live API.
|
|
125
|
+
* Max/default dims: 1536 / 3072 — confirmed by capture
|
|
126
|
+
* ("Invalid value for 'dimensions' = 5000. Must be less than or equal to 1536.").
|
|
80
127
|
*/
|
|
81
128
|
const OAI_EMBEDDING_SETTINGS_SMALL = {
|
|
82
129
|
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens'],
|
|
@@ -108,7 +155,7 @@ exports.DyFM_OAI_Models = [
|
|
|
108
155
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
109
156
|
displayName: 'GPT-5.5',
|
|
110
157
|
tier: 'flagship',
|
|
111
|
-
settingsSchema:
|
|
158
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
112
159
|
status: 'ga',
|
|
113
160
|
contextWindow: 1_050_000,
|
|
114
161
|
maxOutputTokens: 128_000,
|
|
@@ -130,7 +177,7 @@ exports.DyFM_OAI_Models = [
|
|
|
130
177
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
131
178
|
displayName: 'GPT-5.5 Pro',
|
|
132
179
|
tier: 'pro',
|
|
133
|
-
settingsSchema:
|
|
180
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
134
181
|
status: 'ga',
|
|
135
182
|
contextWindow: 1_050_000,
|
|
136
183
|
maxOutputTokens: 128_000,
|
|
@@ -152,7 +199,7 @@ exports.DyFM_OAI_Models = [
|
|
|
152
199
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
153
200
|
displayName: 'GPT-5.4',
|
|
154
201
|
tier: 'flagship',
|
|
155
|
-
settingsSchema:
|
|
202
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
156
203
|
status: 'ga',
|
|
157
204
|
contextWindow: 1_000_000,
|
|
158
205
|
maxOutputTokens: 128_000,
|
|
@@ -174,7 +221,7 @@ exports.DyFM_OAI_Models = [
|
|
|
174
221
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
175
222
|
displayName: 'GPT-5.4 mini',
|
|
176
223
|
tier: 'mini',
|
|
177
|
-
settingsSchema:
|
|
224
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
178
225
|
status: 'ga',
|
|
179
226
|
contextWindow: 400_000,
|
|
180
227
|
maxOutputTokens: 128_000,
|
|
@@ -196,7 +243,7 @@ exports.DyFM_OAI_Models = [
|
|
|
196
243
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
197
244
|
displayName: 'GPT-5.4 nano',
|
|
198
245
|
tier: 'nano',
|
|
199
|
-
settingsSchema:
|
|
246
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
200
247
|
status: 'ga',
|
|
201
248
|
contextWindow: 400_000,
|
|
202
249
|
maxOutputTokens: 128_000,
|
|
@@ -218,7 +265,7 @@ exports.DyFM_OAI_Models = [
|
|
|
218
265
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
219
266
|
displayName: 'o3-pro',
|
|
220
267
|
tier: 'pro',
|
|
221
|
-
settingsSchema:
|
|
268
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
222
269
|
status: 'ga',
|
|
223
270
|
contextWindow: 200_000,
|
|
224
271
|
maxOutputTokens: 100_000,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts"],"names":[],"mappings":";;;AAAA,uEAAoE;AACpE,2EAAuE;AAGvE,6DAA0D;AAE1D;;;;;;;;;;;;;;GAcG;AAEH
|
|
1
|
+
{"version":3,"file":"oai-models.const.js","sourceRoot":"","sources":["../../../../../../src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fsm-dynamo",
|
|
3
|
-
"version": "01.16.
|
|
3
|
+
"version": "01.16.24",
|
|
4
4
|
"description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "full-stack-package",
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "oai-reasoning-temperature",
|
|
4
|
+
"provider": "open-ai",
|
|
5
|
+
"model": "gpt-5.4-mini",
|
|
6
|
+
"intent": "reasoning + temperature",
|
|
7
|
+
"httpStatus": 400,
|
|
8
|
+
"unexpectedSuccess": false,
|
|
9
|
+
"providerErrorBody": {
|
|
10
|
+
"error": {
|
|
11
|
+
"message": "Could not finish the message because max_tokens or model output limit was reached. Please try again with higher max_tokens.",
|
|
12
|
+
"type": "invalid_request_error",
|
|
13
|
+
"param": null,
|
|
14
|
+
"code": null
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"capturedAt": "2026-07-22T00:04:01.091Z"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "oai-reasoning-top_p",
|
|
21
|
+
"provider": "open-ai",
|
|
22
|
+
"model": "gpt-5.4-mini",
|
|
23
|
+
"intent": "reasoning + top_p",
|
|
24
|
+
"httpStatus": 400,
|
|
25
|
+
"unexpectedSuccess": false,
|
|
26
|
+
"providerErrorBody": {
|
|
27
|
+
"error": {
|
|
28
|
+
"message": "Could not finish the message because max_tokens or model output limit was reached. Please try again with higher max_tokens.",
|
|
29
|
+
"type": "invalid_request_error",
|
|
30
|
+
"param": null,
|
|
31
|
+
"code": null
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"capturedAt": "2026-07-22T00:04:02.064Z"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "oai-reasoning-frequency_penalty",
|
|
38
|
+
"provider": "open-ai",
|
|
39
|
+
"model": "gpt-5.4-mini",
|
|
40
|
+
"intent": "reasoning + frequency_penalty",
|
|
41
|
+
"httpStatus": 400,
|
|
42
|
+
"unexpectedSuccess": false,
|
|
43
|
+
"providerErrorBody": {
|
|
44
|
+
"error": {
|
|
45
|
+
"message": "Could not finish the message because max_tokens or model output limit was reached. Please try again with higher max_tokens.",
|
|
46
|
+
"type": "invalid_request_error",
|
|
47
|
+
"param": null,
|
|
48
|
+
"code": null
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"capturedAt": "2026-07-22T00:04:03.794Z"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"id": "oai-reasoning-presence_penalty",
|
|
55
|
+
"provider": "open-ai",
|
|
56
|
+
"model": "gpt-5.4-mini",
|
|
57
|
+
"intent": "reasoning + presence_penalty",
|
|
58
|
+
"httpStatus": 400,
|
|
59
|
+
"unexpectedSuccess": false,
|
|
60
|
+
"providerErrorBody": {
|
|
61
|
+
"error": {
|
|
62
|
+
"message": "Could not finish the message because max_tokens or model output limit was reached. Please try again with higher max_tokens.",
|
|
63
|
+
"type": "invalid_request_error",
|
|
64
|
+
"param": null,
|
|
65
|
+
"code": null
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"capturedAt": "2026-07-22T00:04:04.343Z"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "oai-range-temperature-3",
|
|
72
|
+
"provider": "open-ai",
|
|
73
|
+
"model": "gpt-4o-mini",
|
|
74
|
+
"intent": "temperature 3 (max 2)",
|
|
75
|
+
"httpStatus": 400,
|
|
76
|
+
"unexpectedSuccess": false,
|
|
77
|
+
"providerErrorBody": {
|
|
78
|
+
"error": {
|
|
79
|
+
"message": "Invalid 'temperature': decimal above maximum value. Expected a value <= 2, but got 3 instead.",
|
|
80
|
+
"type": "invalid_request_error",
|
|
81
|
+
"param": "temperature",
|
|
82
|
+
"code": "decimal_above_max_value"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"capturedAt": "2026-07-22T00:04:04.524Z"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"id": "oai-range-top_p-1.5",
|
|
89
|
+
"provider": "open-ai",
|
|
90
|
+
"model": "gpt-4o-mini",
|
|
91
|
+
"intent": "top_p 1.5 (max 1)",
|
|
92
|
+
"httpStatus": 400,
|
|
93
|
+
"unexpectedSuccess": false,
|
|
94
|
+
"providerErrorBody": {
|
|
95
|
+
"error": {
|
|
96
|
+
"message": "Invalid 'top_p': decimal above maximum value. Expected a value <= 1, but got 1.5 instead.",
|
|
97
|
+
"type": "invalid_request_error",
|
|
98
|
+
"param": "top_p",
|
|
99
|
+
"code": "decimal_above_max_value"
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
"capturedAt": "2026-07-22T00:04:04.712Z"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "oai-range-frequency_penalty-5",
|
|
106
|
+
"provider": "open-ai",
|
|
107
|
+
"model": "gpt-4o-mini",
|
|
108
|
+
"intent": "frequency_penalty 5 (max 2)",
|
|
109
|
+
"httpStatus": 400,
|
|
110
|
+
"unexpectedSuccess": false,
|
|
111
|
+
"providerErrorBody": {
|
|
112
|
+
"error": {
|
|
113
|
+
"message": "Invalid 'frequency_penalty': decimal above maximum value. Expected a value <= 2, but got 5 instead.",
|
|
114
|
+
"type": "invalid_request_error",
|
|
115
|
+
"param": "frequency_penalty",
|
|
116
|
+
"code": "decimal_above_max_value"
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"capturedAt": "2026-07-22T00:04:04.897Z"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "oai-unknown-model",
|
|
123
|
+
"provider": "open-ai",
|
|
124
|
+
"model": "gpt-does-not-exist-xyz",
|
|
125
|
+
"intent": "ismeretlen modell",
|
|
126
|
+
"httpStatus": 404,
|
|
127
|
+
"unexpectedSuccess": false,
|
|
128
|
+
"providerErrorBody": {
|
|
129
|
+
"error": {
|
|
130
|
+
"message": "The model `gpt-does-not-exist-xyz` does not exist or you do not have access to it.",
|
|
131
|
+
"type": "invalid_request_error",
|
|
132
|
+
"param": null,
|
|
133
|
+
"code": "model_not_found"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"capturedAt": "2026-07-22T00:04:05.328Z"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"id": "oai-emb-dimensions-5000",
|
|
140
|
+
"provider": "open-ai",
|
|
141
|
+
"model": "text-embedding-3-small",
|
|
142
|
+
"intent": "dimensions 5000 (max 1536)",
|
|
143
|
+
"httpStatus": 400,
|
|
144
|
+
"unexpectedSuccess": false,
|
|
145
|
+
"providerErrorBody": {
|
|
146
|
+
"error": {
|
|
147
|
+
"message": "Invalid value for 'dimensions' = 5000. Must be less than or equal to 1536.",
|
|
148
|
+
"type": "invalid_request_error",
|
|
149
|
+
"param": null,
|
|
150
|
+
"code": null
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
"capturedAt": "2026-07-22T00:04:06.732Z"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"id": "oai-emb-temperature",
|
|
157
|
+
"provider": "open-ai",
|
|
158
|
+
"model": "text-embedding-3-small",
|
|
159
|
+
"intent": "embedding + temperature (400 vagy ignoralas?)",
|
|
160
|
+
"httpStatus": 200,
|
|
161
|
+
"unexpectedSuccess": true,
|
|
162
|
+
"providerErrorBody": {
|
|
163
|
+
"note": "ACCEPTED — a parameter megis ervenyes (felfedezes)"
|
|
164
|
+
},
|
|
165
|
+
"capturedAt": "2026-07-22T00:04:06.892Z"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"id": "aai-sonnet-temperature-1.5",
|
|
169
|
+
"provider": "anthropic",
|
|
170
|
+
"model": "claude-sonnet-4-6",
|
|
171
|
+
"intent": "temperature 1.5 (max 1.0)",
|
|
172
|
+
"httpStatus": 400,
|
|
173
|
+
"unexpectedSuccess": false,
|
|
174
|
+
"providerErrorBody": {
|
|
175
|
+
"type": "error",
|
|
176
|
+
"error": {
|
|
177
|
+
"type": "invalid_request_error",
|
|
178
|
+
"message": "temperature: range: 0..1"
|
|
179
|
+
},
|
|
180
|
+
"request_id": "req_011CdG7m6xLpoFmfR1rs6Hgc"
|
|
181
|
+
},
|
|
182
|
+
"capturedAt": "2026-07-22T00:04:07.210Z"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"id": "aai-opus-temperature",
|
|
186
|
+
"provider": "anthropic",
|
|
187
|
+
"model": "claude-opus-4-8",
|
|
188
|
+
"intent": "Opus + temperature (FR-048 kiindulo eset)",
|
|
189
|
+
"httpStatus": 400,
|
|
190
|
+
"unexpectedSuccess": false,
|
|
191
|
+
"providerErrorBody": {
|
|
192
|
+
"type": "error",
|
|
193
|
+
"error": {
|
|
194
|
+
"type": "invalid_request_error",
|
|
195
|
+
"message": "`temperature` is deprecated for this model."
|
|
196
|
+
},
|
|
197
|
+
"request_id": "req_011CdG7m8BWbYfNhNdvLLsoW"
|
|
198
|
+
},
|
|
199
|
+
"capturedAt": "2026-07-22T00:04:07.535Z"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "aai-haiku-top_k-negative",
|
|
203
|
+
"provider": "anthropic",
|
|
204
|
+
"model": "claude-haiku-4-5",
|
|
205
|
+
"intent": "top_k -1",
|
|
206
|
+
"httpStatus": 200,
|
|
207
|
+
"unexpectedSuccess": true,
|
|
208
|
+
"providerErrorBody": {
|
|
209
|
+
"note": "ACCEPTED — a parameter megis ervenyes (felfedezes)"
|
|
210
|
+
},
|
|
211
|
+
"capturedAt": "2026-07-22T00:04:08.174Z"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "aai-unknown-model",
|
|
215
|
+
"provider": "anthropic",
|
|
216
|
+
"model": "claude-does-not-exist-xyz",
|
|
217
|
+
"intent": "ismeretlen modell",
|
|
218
|
+
"httpStatus": 404,
|
|
219
|
+
"unexpectedSuccess": false,
|
|
220
|
+
"providerErrorBody": {
|
|
221
|
+
"type": "error",
|
|
222
|
+
"error": {
|
|
223
|
+
"type": "not_found_error",
|
|
224
|
+
"message": "model: claude-does-not-exist-xyz"
|
|
225
|
+
},
|
|
226
|
+
"request_id": "req_011CdG7mCG5N424vf4HG3p4T"
|
|
227
|
+
},
|
|
228
|
+
"capturedAt": "2026-07-22T00:04:08.467Z"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"id": "gai-range-temperature",
|
|
232
|
+
"provider": "google",
|
|
233
|
+
"model": "gemini-3.5-flash",
|
|
234
|
+
"intent": "temperature = 5 (hatar felderites)",
|
|
235
|
+
"httpStatus": 400,
|
|
236
|
+
"unexpectedSuccess": false,
|
|
237
|
+
"providerErrorBody": {
|
|
238
|
+
"error": {
|
|
239
|
+
"code": 400,
|
|
240
|
+
"message": "* GenerateContentRequest.generation_config.temperature: temperature must be in the range [0.0, 2.0].\n",
|
|
241
|
+
"status": "INVALID_ARGUMENT"
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
"capturedAt": "2026-07-22T00:04:08.825Z"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"id": "gai-range-topP",
|
|
248
|
+
"provider": "google",
|
|
249
|
+
"model": "gemini-3.5-flash",
|
|
250
|
+
"intent": "topP = 1.5 (hatar felderites)",
|
|
251
|
+
"httpStatus": 400,
|
|
252
|
+
"unexpectedSuccess": false,
|
|
253
|
+
"providerErrorBody": {
|
|
254
|
+
"error": {
|
|
255
|
+
"code": 400,
|
|
256
|
+
"message": "* GenerateContentRequest.generation_config.top_p: top_p must be in the range [0.0, 1.0].\n",
|
|
257
|
+
"status": "INVALID_ARGUMENT"
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"capturedAt": "2026-07-22T00:04:09.014Z"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"id": "gai-range-topK",
|
|
264
|
+
"provider": "google",
|
|
265
|
+
"model": "gemini-3.5-flash",
|
|
266
|
+
"intent": "topK = -1 (hatar felderites)",
|
|
267
|
+
"httpStatus": 400,
|
|
268
|
+
"unexpectedSuccess": false,
|
|
269
|
+
"providerErrorBody": {
|
|
270
|
+
"error": {
|
|
271
|
+
"code": 400,
|
|
272
|
+
"message": "* GenerateContentRequest.generation_config.top_k: top_k must be nonnegative.\n",
|
|
273
|
+
"status": "INVALID_ARGUMENT"
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"capturedAt": "2026-07-22T00:04:09.102Z"
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"id": "gai-range-candidateCount",
|
|
280
|
+
"provider": "google",
|
|
281
|
+
"model": "gemini-3.5-flash",
|
|
282
|
+
"intent": "candidateCount = 99 (hatar felderites)",
|
|
283
|
+
"httpStatus": 400,
|
|
284
|
+
"unexpectedSuccess": false,
|
|
285
|
+
"providerErrorBody": {
|
|
286
|
+
"error": {
|
|
287
|
+
"code": 400,
|
|
288
|
+
"message": "* GenerateContentRequest.generation_config.candidate_count: candidate_count must be in the range [1, 8].\n",
|
|
289
|
+
"status": "INVALID_ARGUMENT"
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
"capturedAt": "2026-07-22T00:04:09.301Z"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
"id": "gai-unknown-model",
|
|
296
|
+
"provider": "google",
|
|
297
|
+
"model": "gemini-does-not-exist-xyz",
|
|
298
|
+
"intent": "ismeretlen modell",
|
|
299
|
+
"httpStatus": 404,
|
|
300
|
+
"unexpectedSuccess": false,
|
|
301
|
+
"providerErrorBody": {
|
|
302
|
+
"error": {
|
|
303
|
+
"code": 404,
|
|
304
|
+
"message": "models/gemini-does-not-exist-xyz is not found for API version v1beta, or is not supported for generateContent. Call ModelService.ListModels to see the list of available models and their supported methods.",
|
|
305
|
+
"status": "NOT_FOUND"
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"capturedAt": "2026-07-22T00:04:09.388Z"
|
|
309
|
+
}
|
|
310
|
+
]
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI HIBA-CAPTURE runner (runbook §2b) — SZANDEKOSAN hibas hivasok, a byte-hu provider-hibak rogzitesehez.
|
|
3
|
+
*
|
|
4
|
+
* MIERT ~INGYENES: a szerver a validaciot a GENERALAS ELOTT vegzi, tehat egy elutasitott keres nem termel
|
|
5
|
+
* output-tokent. Ahol megis atmehetne (pl. ha egy parametert megis elfogad), ott a keres `max_tokens: 1` +
|
|
6
|
+
* 1-2 tokenes prompt — igy a "veletlen siker" is toredek-cent.
|
|
7
|
+
*
|
|
8
|
+
* HARD SZABALYOK (runbook §2b/§2c):
|
|
9
|
+
* - CSAK hibat celzo keres. Sikeres generalast ez a script NEM inditt szandekosan.
|
|
10
|
+
* - MINDEN eset AZONNAL kiirodik lemezre (inkrementalis) — ha a kulcs a 10. hivasnal kifogy, az addigi 9 megmarad.
|
|
11
|
+
* - 429 / quota eseten az ADOTT provider tovabbi esetei kimaradnak (a kvota-hiba NEM modell-viselkedes,
|
|
12
|
+
* tehat NEM egethetjuk be fixture-kent), a tobbi provider megy tovabb.
|
|
13
|
+
* - Kulcs-ertek SOHA nem kerul kiirasra; a valasz-body-n redakcio fut (defense in depth).
|
|
14
|
+
* - Ha egy eset VARATLANUL SIKERES → az maga is FELFEDEZES (a parameter megis elfogadott) → rogzitjuk.
|
|
15
|
+
*
|
|
16
|
+
* Futtatas: node scripts/ai-error-capture.js
|
|
17
|
+
* Kimenet: scripts/_capture-out/ai-error-capture.json (nyers capture; fixture-re kuratalas KESOBB, leak-review utan)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
const fs = require('fs');
|
|
21
|
+
const path = require('path');
|
|
22
|
+
|
|
23
|
+
const ENV_PATH = path.resolve(__dirname, '../../../fdp-devops/.env');
|
|
24
|
+
const OUT_DIR = path.resolve(__dirname, '_capture-out');
|
|
25
|
+
const OUT_FILE = path.join(OUT_DIR, 'ai-error-capture.json');
|
|
26
|
+
|
|
27
|
+
function loadEnv() {
|
|
28
|
+
const out = {};
|
|
29
|
+
for (const line of fs.readFileSync(ENV_PATH, 'utf8').split(/\r?\n/)) {
|
|
30
|
+
const m = line.match(/^([A-Z0-9_]+)=(.*)$/);
|
|
31
|
+
if (m) { out[m[1]] = m[2].trim().replace(/^["']|["']$/g, ''); }
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Kulcs-szeru mintak kiszurese a rogzitett szovegbol (runbook §4.0). */
|
|
37
|
+
function redact(text) {
|
|
38
|
+
return String(text)
|
|
39
|
+
.replace(/sk-ant-[A-Za-z0-9_-]+/g, 'sk-ant-REDACTED')
|
|
40
|
+
.replace(/sk-[A-Za-z0-9_-]{20,}/g, 'sk-REDACTED')
|
|
41
|
+
.replace(/AIza[A-Za-z0-9_-]{20,}/g, 'AIza-REDACTED')
|
|
42
|
+
.replace(/Bearer\s+[A-Za-z0-9._-]+/g, 'Bearer REDACTED');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const results = [];
|
|
46
|
+
function persist(entry) {
|
|
47
|
+
results.push(entry);
|
|
48
|
+
fs.mkdirSync(OUT_DIR, { recursive: true });
|
|
49
|
+
fs.writeFileSync(OUT_FILE, JSON.stringify(results, null, 2));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Egy eset lefuttatasa. Visszaadja: 'ok' | 'quota' */
|
|
53
|
+
async function runCase(c, env) {
|
|
54
|
+
const key = env[c.envKey];
|
|
55
|
+
if (!key) { return 'ok'; }
|
|
56
|
+
|
|
57
|
+
let status = 0;
|
|
58
|
+
let bodyText = '';
|
|
59
|
+
try {
|
|
60
|
+
const r = await fetch(c.url(key), { method: 'POST', headers: c.headers(key), body: JSON.stringify(c.body) });
|
|
61
|
+
status = r.status;
|
|
62
|
+
bodyText = await r.text();
|
|
63
|
+
} catch (e) {
|
|
64
|
+
bodyText = JSON.stringify({ networkError: String(e.message) });
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
let parsed = null;
|
|
68
|
+
try { parsed = JSON.parse(redact(bodyText)); } catch { parsed = { raw: redact(bodyText).slice(0, 800) }; }
|
|
69
|
+
|
|
70
|
+
const unexpectedSuccess = status >= 200 && status < 300;
|
|
71
|
+
|
|
72
|
+
persist({
|
|
73
|
+
id: c.id,
|
|
74
|
+
provider: c.provider,
|
|
75
|
+
model: c.model,
|
|
76
|
+
intent: c.intent,
|
|
77
|
+
httpStatus: status,
|
|
78
|
+
unexpectedSuccess: unexpectedSuccess,
|
|
79
|
+
providerErrorBody: unexpectedSuccess ? { note: 'ACCEPTED — a parameter megis ervenyes (felfedezes)' } : parsed,
|
|
80
|
+
capturedAt: new Date().toISOString(),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const marker = unexpectedSuccess ? '⚠️ ELFOGADTA' : `HTTP ${status}`;
|
|
84
|
+
console.log(` [${c.id}] ${c.provider}/${c.model} — ${c.intent} → ${marker}`);
|
|
85
|
+
|
|
86
|
+
if (status === 429) { return 'quota'; }
|
|
87
|
+
return 'ok';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── esetek (runbook §2b) ─────────────────────────────────────────────────────
|
|
91
|
+
const OAI_CHAT = (key) => 'https://api.openai.com/v1/chat/completions';
|
|
92
|
+
const OAI_EMB = (key) => 'https://api.openai.com/v1/embeddings';
|
|
93
|
+
const OAI_H = (key) => ({ Authorization: `Bearer ${key}`, 'content-type': 'application/json' });
|
|
94
|
+
const AAI_URL = () => 'https://api.anthropic.com/v1/messages';
|
|
95
|
+
const AAI_H = (key) => ({ 'x-api-key': key, 'anthropic-version': '2023-06-01', 'content-type': 'application/json' });
|
|
96
|
+
const GAI_URL = (model) => (key) =>
|
|
97
|
+
`https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent?key=${key}`;
|
|
98
|
+
const GAI_H = () => ({ 'content-type': 'application/json' });
|
|
99
|
+
|
|
100
|
+
const msg = [ { role: 'user', content: 'hi' } ];
|
|
101
|
+
const oaiChat = (model, extra) => ({ model, messages: msg, max_completion_tokens: 1, ...extra });
|
|
102
|
+
const aaiMsg = (model, extra) => ({ model, messages: msg, max_tokens: 1, ...extra });
|
|
103
|
+
const gaiBody = (extra) => ({ contents: [ { parts: [ { text: 'hi' } ] } ], generationConfig: { maxOutputTokens: 1, ...extra } });
|
|
104
|
+
|
|
105
|
+
const CASES = [
|
|
106
|
+
// OpenAI — reasoning modell elutasitja a sampling-parametereket
|
|
107
|
+
...[ 'temperature', 'top_p', 'frequency_penalty', 'presence_penalty' ].map((p, i) => ({
|
|
108
|
+
id: `oai-reasoning-${p}`, provider: 'open-ai', model: 'gpt-5.4-mini', envKey: 'OPENAI_API_KEY',
|
|
109
|
+
intent: `reasoning + ${p}`, url: OAI_CHAT, headers: OAI_H, body: oaiChat('gpt-5.4-mini', { [p]: 0.5 }),
|
|
110
|
+
})),
|
|
111
|
+
// OpenAI — tartomanyon kivuli ertekek klasszikus modellen
|
|
112
|
+
{ id: 'oai-range-temperature-3', provider: 'open-ai', model: 'gpt-4o-mini', envKey: 'OPENAI_API_KEY',
|
|
113
|
+
intent: 'temperature 3 (max 2)', url: OAI_CHAT, headers: OAI_H, body: oaiChat('gpt-4o-mini', { temperature: 3 }) },
|
|
114
|
+
{ id: 'oai-range-top_p-1.5', provider: 'open-ai', model: 'gpt-4o-mini', envKey: 'OPENAI_API_KEY',
|
|
115
|
+
intent: 'top_p 1.5 (max 1)', url: OAI_CHAT, headers: OAI_H, body: oaiChat('gpt-4o-mini', { top_p: 1.5 }) },
|
|
116
|
+
{ id: 'oai-range-frequency_penalty-5', provider: 'open-ai', model: 'gpt-4o-mini', envKey: 'OPENAI_API_KEY',
|
|
117
|
+
intent: 'frequency_penalty 5 (max 2)', url: OAI_CHAT, headers: OAI_H, body: oaiChat('gpt-4o-mini', { frequency_penalty: 5 }) },
|
|
118
|
+
{ id: 'oai-unknown-model', provider: 'open-ai', model: 'gpt-does-not-exist-xyz', envKey: 'OPENAI_API_KEY',
|
|
119
|
+
intent: 'ismeretlen modell', url: OAI_CHAT, headers: OAI_H, body: oaiChat('gpt-does-not-exist-xyz', {}) },
|
|
120
|
+
// OpenAI — embedding
|
|
121
|
+
{ id: 'oai-emb-dimensions-5000', provider: 'open-ai', model: 'text-embedding-3-small', envKey: 'OPENAI_API_KEY',
|
|
122
|
+
intent: 'dimensions 5000 (max 1536)', url: OAI_EMB, headers: OAI_H,
|
|
123
|
+
body: { model: 'text-embedding-3-small', input: 'hi', dimensions: 5000 } },
|
|
124
|
+
{ id: 'oai-emb-temperature', provider: 'open-ai', model: 'text-embedding-3-small', envKey: 'OPENAI_API_KEY',
|
|
125
|
+
intent: 'embedding + temperature (400 vagy ignoralas?)', url: OAI_EMB, headers: OAI_H,
|
|
126
|
+
body: { model: 'text-embedding-3-small', input: 'hi', temperature: 0.5 } },
|
|
127
|
+
|
|
128
|
+
// Anthropic
|
|
129
|
+
{ id: 'aai-sonnet-temperature-1.5', provider: 'anthropic', model: 'claude-sonnet-4-6', envKey: 'ANTHROPIC_API_KEY',
|
|
130
|
+
intent: 'temperature 1.5 (max 1.0)', url: AAI_URL, headers: AAI_H, body: aaiMsg('claude-sonnet-4-6', { temperature: 1.5 }) },
|
|
131
|
+
{ id: 'aai-opus-temperature', provider: 'anthropic', model: 'claude-opus-4-8', envKey: 'ANTHROPIC_API_KEY',
|
|
132
|
+
intent: 'Opus + temperature (FR-048 kiindulo eset)', url: AAI_URL, headers: AAI_H, body: aaiMsg('claude-opus-4-8', { temperature: 0.5 }) },
|
|
133
|
+
{ id: 'aai-haiku-top_k-negative', provider: 'anthropic', model: 'claude-haiku-4-5', envKey: 'ANTHROPIC_API_KEY',
|
|
134
|
+
intent: 'top_k -1', url: AAI_URL, headers: AAI_H, body: aaiMsg('claude-haiku-4-5', { top_k: -1 }) },
|
|
135
|
+
{ id: 'aai-unknown-model', provider: 'anthropic', model: 'claude-does-not-exist-xyz', envKey: 'ANTHROPIC_API_KEY',
|
|
136
|
+
intent: 'ismeretlen modell', url: AAI_URL, headers: AAI_H, body: aaiMsg('claude-does-not-exist-xyz', {}) },
|
|
137
|
+
|
|
138
|
+
// Google — a hibauzenet FELDERITI a dokumentalatlan hatarokat
|
|
139
|
+
...[ [ 'temperature', 5 ], [ 'topP', 1.5 ], [ 'topK', -1 ], [ 'candidateCount', 99 ] ].map(([ p, v ]) => ({
|
|
140
|
+
id: `gai-range-${p}`, provider: 'google', model: 'gemini-3.5-flash', envKey: 'GOOGLE_API_KEY',
|
|
141
|
+
intent: `${p} = ${v} (hatar felderites)`, url: GAI_URL('gemini-3.5-flash'), headers: GAI_H, body: gaiBody({ [p]: v }),
|
|
142
|
+
})),
|
|
143
|
+
{ id: 'gai-unknown-model', provider: 'google', model: 'gemini-does-not-exist-xyz', envKey: 'GOOGLE_API_KEY',
|
|
144
|
+
intent: 'ismeretlen modell', url: GAI_URL('gemini-does-not-exist-xyz'), headers: GAI_H, body: gaiBody({}) },
|
|
145
|
+
];
|
|
146
|
+
|
|
147
|
+
(async () => {
|
|
148
|
+
const env = loadEnv();
|
|
149
|
+
const quotaHit = new Set();
|
|
150
|
+
|
|
151
|
+
console.log('AI HIBA-CAPTURE — csak elutasitando keresek (max_tokens:1, hogy a veletlen siker is toredek-cent)\n');
|
|
152
|
+
|
|
153
|
+
for (const c of CASES) {
|
|
154
|
+
if (quotaHit.has(c.provider)) {
|
|
155
|
+
console.log(` [${c.id}] KIHAGYVA — ${c.provider} kvota-hiba miatt leallt`);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const r = await runCase(c, env);
|
|
159
|
+
if (r === 'quota') {
|
|
160
|
+
quotaHit.add(c.provider);
|
|
161
|
+
console.log(` ⚠️ ${c.provider}: 429/kvota → a tovabbi esetei kimaradnak (a kvota-hiba NEM fixture)`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
console.log(`\n✅ ${results.length} eset rogzitve → ${OUT_FILE}`);
|
|
166
|
+
})();
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI model-registry ellenorzo — READ-ONLY, INGYENES.
|
|
3
|
+
*
|
|
4
|
+
* A providerek sajat list-models vegpontjaibol lekeri az ELO modell-listat, es osszeveti a fsm-registryvel
|
|
5
|
+
* (`DyFM_OAI_Models` / `DyFM_AAI_Models` / `DyFM_GAI_Models`). NEM general semmit — a modell-listazas nem
|
|
6
|
+
* inference-hivas, tehat nem kerul penzbe; egyben validalja, hogy a kulcsok mukodnek-e.
|
|
7
|
+
*
|
|
8
|
+
* Kulcsok: `fdp-devops/.env` (OPENAI_API_KEY / ANTHROPIC_API_KEY / GOOGLE_API_KEY). A script a kulcsok
|
|
9
|
+
* ERTEKET SOHA nem irja ki — csak azt, hogy megvan-e.
|
|
10
|
+
*
|
|
11
|
+
* Megjegyzes: a `scripts/` mappa .js-t hasznal (l. verify-build-completeness.js, run-coverage-tests.js) —
|
|
12
|
+
* ezt a meglevo precedenst koveti, a TS-only szabaly a `src/`-re vonatkozik.
|
|
13
|
+
*
|
|
14
|
+
* Futtatas: node scripts/ai-model-registry-check.js
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
|
|
20
|
+
const ENV_PATH = path.resolve(__dirname, '../../../fdp-devops/.env');
|
|
21
|
+
const BUILD = path.resolve(__dirname, '../build/_modules/ai/_modules');
|
|
22
|
+
|
|
23
|
+
/** .env beolvasas (csak a szukseges kulcsokra). */
|
|
24
|
+
function loadEnv() {
|
|
25
|
+
const out = {};
|
|
26
|
+
if (!fs.existsSync(ENV_PATH)) {
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
for (const line of fs.readFileSync(ENV_PATH, 'utf8').split(/\r?\n/)) {
|
|
30
|
+
const m = line.match(/^([A-Z0-9_]+)=(.*)$/);
|
|
31
|
+
if (m) {
|
|
32
|
+
out[m[1]] = m[2].trim().replace(/^["']|["']$/g, '');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** A fsm-registry modell-id-jai providerenkent. */
|
|
39
|
+
function loadRegistry() {
|
|
40
|
+
const read = (rel, key) => {
|
|
41
|
+
try {
|
|
42
|
+
const mod = require(path.join(BUILD, rel));
|
|
43
|
+
return (mod[key] || []).map((m) => m.id);
|
|
44
|
+
} catch (e) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
openai: read('open-ai/_collections/oai-models.const.js', 'DyFM_OAI_Models'),
|
|
50
|
+
anthropic: read('anthropic/_collections/aai-models.const.js', 'DyFM_AAI_Models'),
|
|
51
|
+
google: read('google-ai/_collections/gai-models.const.js', 'DyFM_GAI_Models'),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function listOpenAI(key) {
|
|
56
|
+
const r = await fetch('https://api.openai.com/v1/models', {
|
|
57
|
+
headers: { Authorization: `Bearer ${key}` },
|
|
58
|
+
});
|
|
59
|
+
if (!r.ok) {
|
|
60
|
+
throw new Error(`HTTP ${r.status} ${(await r.text()).slice(0, 200)}`);
|
|
61
|
+
}
|
|
62
|
+
return (await r.json()).data.map((m) => m.id);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function listAnthropic(key) {
|
|
66
|
+
const r = await fetch('https://api.anthropic.com/v1/models?limit=100', {
|
|
67
|
+
headers: { 'x-api-key': key, 'anthropic-version': '2023-06-01' },
|
|
68
|
+
});
|
|
69
|
+
if (!r.ok) {
|
|
70
|
+
throw new Error(`HTTP ${r.status} ${(await r.text()).slice(0, 200)}`);
|
|
71
|
+
}
|
|
72
|
+
return (await r.json()).data.map((m) => m.id);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function listGoogle(key) {
|
|
76
|
+
const r = await fetch(`https://generativelanguage.googleapis.com/v1beta/models?key=${key}&pageSize=200`);
|
|
77
|
+
if (!r.ok) {
|
|
78
|
+
throw new Error(`HTTP ${r.status} ${(await r.text()).slice(0, 200)}`);
|
|
79
|
+
}
|
|
80
|
+
return (await r.json()).models.map((m) => String(m.name).replace(/^models\//, ''));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function report(name, registryIds, liveIds) {
|
|
84
|
+
console.log(`\n=== ${name} ===`);
|
|
85
|
+
if (registryIds === null) {
|
|
86
|
+
console.log(' ⚠️ registry nem olvashato (build hianyzik?)');
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const live = new Set(liveIds);
|
|
90
|
+
const reg = new Set(registryIds);
|
|
91
|
+
|
|
92
|
+
const stale = registryIds.filter((id) => !live.has(id));
|
|
93
|
+
const missing = liveIds.filter((id) => !reg.has(id));
|
|
94
|
+
|
|
95
|
+
console.log(` registry: ${registryIds.length} · elo: ${liveIds.length}`);
|
|
96
|
+
console.log(` ❌ registryben van, de NEM elo (${stale.length}): ${stale.join(', ') || '—'}`);
|
|
97
|
+
console.log(` ➕ elo, de NINCS registryben (${missing.length}):`);
|
|
98
|
+
for (const id of missing.slice(0, 60)) {
|
|
99
|
+
console.log(` ${id}`);
|
|
100
|
+
}
|
|
101
|
+
if (missing.length > 60) {
|
|
102
|
+
console.log(` … +${missing.length - 60} tovabbi`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
(async () => {
|
|
107
|
+
const env = loadEnv();
|
|
108
|
+
const registry = loadRegistry();
|
|
109
|
+
|
|
110
|
+
const providers = [
|
|
111
|
+
{ name: 'OpenAI', envKey: 'OPENAI_API_KEY', list: listOpenAI, reg: registry.openai },
|
|
112
|
+
{ name: 'Anthropic', envKey: 'ANTHROPIC_API_KEY', list: listAnthropic, reg: registry.anthropic },
|
|
113
|
+
{ name: 'Google', envKey: 'GOOGLE_API_KEY', list: listGoogle, reg: registry.google },
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
console.log('AI model-registry check — READ-ONLY (listazas, nem generalas → nem kerul penzbe)');
|
|
117
|
+
|
|
118
|
+
for (const p of providers) {
|
|
119
|
+
const key = env[p.envKey];
|
|
120
|
+
if (!key) {
|
|
121
|
+
console.log(`\n=== ${p.name} ===\n ⚠️ ${p.envKey} nincs beallitva — kihagyva`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const live = await p.list(key);
|
|
126
|
+
report(p.name, p.reg, live);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
console.log(`\n=== ${p.name} ===\n ❌ lekeres SIKERTELEN: ${e.message}`);
|
|
129
|
+
console.log(' (kulcs ervenytelen / lejart / nincs jogosultsag a list-models-re)');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
})();
|
|
@@ -29,8 +29,10 @@ const AAI_OPUS_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
29
29
|
unsupported: [ 'temperature', 'topP', 'topK' ],
|
|
30
30
|
constraints: {
|
|
31
31
|
maxTokens: {
|
|
32
|
-
note: '
|
|
33
|
-
'
|
|
32
|
+
note: 'REQUIRED — empirically verified by live capture 2026-07-21: omitting it returns HTTP 400 ' +
|
|
33
|
+
'`{"type":"error","error":{"type":"invalid_request_error","message":"max_tokens: Field required"},"request_id":"req_..."}`. ' +
|
|
34
|
+
'The published docs do NOT state this, hence the capture. Per-model maximum varies (see `maxOutputTokens`), ' +
|
|
35
|
+
'so no global min/max is encoded.',
|
|
34
36
|
},
|
|
35
37
|
},
|
|
36
38
|
};
|
|
@@ -38,6 +40,9 @@ const AAI_OPUS_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
38
40
|
/**
|
|
39
41
|
* Sonnet / Haiku still ACCEPT the sampling params (only Opus 4.7+ rejects them).
|
|
40
42
|
*
|
|
43
|
+
* **`topK`: NINCS bound kodolva** — live capture 2026-07-21: a `top_k: -1` **HTTP 200-zal ATMENT**, tehat a
|
|
44
|
+
* szerver nem validalja alulrol. Egy kitalalt `min: 0` itt hibas clamp-et okozna.
|
|
45
|
+
*
|
|
41
46
|
* **Fontos provider-kulonbseg:** az Anthropic `temperature` maximuma **1.0**, NEM 2.0 mint az OpenAI-nal —
|
|
42
47
|
* egy OpenAI-nal ervenyes `temperature: 1.5` itt ervenytelen. A validator ezt most elkapja.
|
|
43
48
|
* `topP` / `topK`: az API-referencia NEM ad meg szamszeru hatarokat → szandekosan nem kodolunk bele semmit.
|
|
@@ -26,6 +26,30 @@ const GAI_CHAT_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
26
26
|
supported: [ 'temperature', 'maxTokens', 'topP' ],
|
|
27
27
|
unsupported: [ 'frequencyPenalty', 'presencePenalty' ],
|
|
28
28
|
extraParams: [ 'topK', 'candidateCount', 'responseSchema', 'thinkingConfig', 'toolConfig' ],
|
|
29
|
+
// A Gemini-doksi NEM publikal szamhatarokat — az alabbiakat SZANDEKOSAN kivaltott hibauzenetekbol
|
|
30
|
+
// mertuk ki (live capture 2026-07-21). Ez volt az EGYETLEN mod verifikalt bound-okhoz jutni.
|
|
31
|
+
constraints: {
|
|
32
|
+
temperature: {
|
|
33
|
+
min: 0,
|
|
34
|
+
max: 2,
|
|
35
|
+
note: 'Capture 2026-07-21: "temperature must be in the range [0.0, 2.0]." — azonos az OpenAI-jal, ' +
|
|
36
|
+
'és NEM az Anthropic 1.0-s plafonjával.',
|
|
37
|
+
},
|
|
38
|
+
topP: {
|
|
39
|
+
min: 0,
|
|
40
|
+
max: 1,
|
|
41
|
+
note: 'Capture 2026-07-21: "top_p must be in the range [0.0, 1.0]."',
|
|
42
|
+
},
|
|
43
|
+
topK: {
|
|
44
|
+
min: 0,
|
|
45
|
+
note: 'Capture 2026-07-21: "top_k must be nonnegative." — felso hatart a szerver NEM kozolt, ezert nincs max.',
|
|
46
|
+
},
|
|
47
|
+
candidateCount: {
|
|
48
|
+
min: 1,
|
|
49
|
+
max: 8,
|
|
50
|
+
note: 'Capture 2026-07-21: "candidate_count must be in the range [1, 8]."',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
29
53
|
};
|
|
30
54
|
|
|
31
55
|
/**
|
|
@@ -21,22 +21,50 @@ import { DyFM_OAI_Model } from '../_enums/oai-model.enum';
|
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
25
|
-
* instead expose a `reasoningEffort` knob.
|
|
24
|
+
* Models that MEASURABLY reject the sampling params (HTTP 400) and expose `reasoningEffort` instead.
|
|
26
25
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
26
|
+
* **Live capture 2026-07-21** — confirmed rejecting: `gpt-5.5`, `o3-mini`, `o4-mini`. Two distinct
|
|
27
|
+
* semantics were observed and both mean "do not send it":
|
|
28
|
+
* - `unsupported_parameter` — the param is not supported at all (o3-mini).
|
|
29
|
+
* - `unsupported_value` — the param exists but only the default is allowed (gpt-5.5, o4-mini:
|
|
30
|
+
* "does not support 0.5 with this model. Only the default (1)").
|
|
31
|
+
*
|
|
32
|
+
* ⚠️ This list is NOT the whole `gpt-5.x` family — see {@link OAI_SAMPLING_ACCEPTED}. The earlier
|
|
33
|
+
* family-wide assumption (FR-047 `isReasoningModel` = `/^gpt-5/`) was falsified by the capture.
|
|
31
34
|
*/
|
|
32
|
-
const
|
|
35
|
+
const OAI_SAMPLING_REJECTED: DyFM_AI_ModelSettingsSchema = {
|
|
33
36
|
supported: [ 'maxTokens' ],
|
|
34
37
|
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty' ],
|
|
35
38
|
extraParams: [ 'reasoningEffort' ],
|
|
36
39
|
constraints: {
|
|
37
40
|
reasoningEffort: {
|
|
38
41
|
allowed: [ 'none', 'low', 'medium', 'high', 'xhigh' ],
|
|
39
|
-
note: 'Reasoning-only knob
|
|
42
|
+
note: 'Reasoning-only knob. Source: FR-048 §Problem (2026-06-01); allowed-set not re-verified by capture.',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Same shape as {@link OAI_SAMPLING_REJECTED}, but **NOT verified by live capture** — kept on the
|
|
49
|
+
* conservative (reject) assumption.
|
|
50
|
+
*
|
|
51
|
+
* Applies to `gpt-5.5-pro` and `o3-pro` only: the pro-tier models were deliberately NOT probed (cost).
|
|
52
|
+
* (`gpt-5.4` was here too, until the 2026-07-21 probe showed it ACCEPTS — see OAI_SAMPLING_ACCEPTED.
|
|
53
|
+
* The emerging pattern is a GENERATION boundary, not "reasoning vs not": the whole 5.4 line accepts,
|
|
54
|
+
* 5.5 rejects. That makes the pro-tier behaviour genuinely unpredictable from the family name alone.)
|
|
55
|
+
*
|
|
56
|
+
* **Risk direction, stated honestly:** if such a model actually ACCEPTS the params, the reconciler
|
|
57
|
+
* drops them silently → the caller's temperature is quietly ignored. That is the milder failure vs.
|
|
58
|
+
* a hard 400, which is why the conservative side was chosen — but it IS an assumption, not a fact.
|
|
59
|
+
* Resolve by probing these three models (one cheap error-call each).
|
|
60
|
+
*/
|
|
61
|
+
const OAI_SAMPLING_UNVERIFIED: DyFM_AI_ModelSettingsSchema = {
|
|
62
|
+
supported: [ 'maxTokens' ],
|
|
63
|
+
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty' ],
|
|
64
|
+
extraParams: [ 'reasoningEffort' ],
|
|
65
|
+
constraints: {
|
|
66
|
+
reasoningEffort: {
|
|
67
|
+
note: 'UNVERIFIED (no live capture) — assumption inherited from the FR-047 family-wide rule.',
|
|
40
68
|
},
|
|
41
69
|
},
|
|
42
70
|
};
|
|
@@ -75,11 +103,32 @@ const OAI_CLASSIC_CHAT_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
75
103
|
};
|
|
76
104
|
|
|
77
105
|
/**
|
|
78
|
-
*
|
|
106
|
+
* `gpt-5.4-mini` / `gpt-5.4-nano` — **MEASURABLY ACCEPT** all four sampling params.
|
|
107
|
+
*
|
|
108
|
+
* **Live capture 2026-07-21:** `temperature` / `topP` / `frequencyPenalty` / `presencePenalty` each
|
|
109
|
+
* returned HTTP 200 with `reasoning_tokens: 0`. They therefore behave like classic chat models, NOT
|
|
110
|
+
* like the rejecting reasoning models — despite matching the `/^gpt-5/` pattern that FR-047 used.
|
|
111
|
+
*
|
|
112
|
+
* `gpt-5.4` (base) was probed separately on 2026-07-21 and ALSO accepts (HTTP 200). The pattern is
|
|
113
|
+
* therefore a **generation boundary**, not "reasoning vs not": the whole 5.4 line accepts, 5.5 rejects.
|
|
114
|
+
* That is precisely why per-model data beats a family-wide regex.
|
|
115
|
+
* Bounds are the documented OpenAI ranges (see {@link OAI_CLASSIC_CHAT_SETTINGS}).
|
|
116
|
+
*/
|
|
117
|
+
const OAI_SAMPLING_ACCEPTED: DyFM_AI_ModelSettingsSchema = {
|
|
118
|
+
...OAI_CLASSIC_CHAT_SETTINGS,
|
|
119
|
+
extraParams: [ 'reasoningEffort' ],
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
79
124
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
125
|
+
* **Live capture 2026-07-21 — CORRECTION:** the sampling params are **NOT rejected**; sending
|
|
126
|
+
* `temperature` to `/v1/embeddings` returns **HTTP 200 and is silently ignored**. They are still listed
|
|
127
|
+
* under `unsupported` so the reconciler DROPS them (dropping a meaningless param is always safe and
|
|
128
|
+
* keeps requests clean) — but note that this does NOT mean the API would 400. The validator's
|
|
129
|
+
* `unsupported_parameter` error for these is therefore stricter than the live API.
|
|
130
|
+
* Max/default dims: 1536 / 3072 — confirmed by capture
|
|
131
|
+
* ("Invalid value for 'dimensions' = 5000. Must be less than or equal to 1536.").
|
|
83
132
|
*/
|
|
84
133
|
const OAI_EMBEDDING_SETTINGS_SMALL: DyFM_AI_ModelSettingsSchema = {
|
|
85
134
|
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens' ],
|
|
@@ -113,7 +162,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
113
162
|
modelType: DyFM_AI_ModelType.Chat,
|
|
114
163
|
displayName: 'GPT-5.5',
|
|
115
164
|
tier: 'flagship',
|
|
116
|
-
settingsSchema:
|
|
165
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
117
166
|
status: 'ga',
|
|
118
167
|
contextWindow: 1_050_000,
|
|
119
168
|
maxOutputTokens: 128_000,
|
|
@@ -135,7 +184,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
135
184
|
modelType: DyFM_AI_ModelType.Chat,
|
|
136
185
|
displayName: 'GPT-5.5 Pro',
|
|
137
186
|
tier: 'pro',
|
|
138
|
-
settingsSchema:
|
|
187
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
139
188
|
status: 'ga',
|
|
140
189
|
contextWindow: 1_050_000,
|
|
141
190
|
maxOutputTokens: 128_000,
|
|
@@ -157,7 +206,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
157
206
|
modelType: DyFM_AI_ModelType.Chat,
|
|
158
207
|
displayName: 'GPT-5.4',
|
|
159
208
|
tier: 'flagship',
|
|
160
|
-
settingsSchema:
|
|
209
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
161
210
|
status: 'ga',
|
|
162
211
|
contextWindow: 1_000_000,
|
|
163
212
|
maxOutputTokens: 128_000,
|
|
@@ -179,7 +228,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
179
228
|
modelType: DyFM_AI_ModelType.Chat,
|
|
180
229
|
displayName: 'GPT-5.4 mini',
|
|
181
230
|
tier: 'mini',
|
|
182
|
-
settingsSchema:
|
|
231
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
183
232
|
status: 'ga',
|
|
184
233
|
contextWindow: 400_000,
|
|
185
234
|
maxOutputTokens: 128_000,
|
|
@@ -201,7 +250,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
201
250
|
modelType: DyFM_AI_ModelType.Chat,
|
|
202
251
|
displayName: 'GPT-5.4 nano',
|
|
203
252
|
tier: 'nano',
|
|
204
|
-
settingsSchema:
|
|
253
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
205
254
|
status: 'ga',
|
|
206
255
|
contextWindow: 400_000,
|
|
207
256
|
maxOutputTokens: 128_000,
|
|
@@ -223,7 +272,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
223
272
|
modelType: DyFM_AI_ModelType.Chat,
|
|
224
273
|
displayName: 'o3-pro',
|
|
225
274
|
tier: 'pro',
|
|
226
|
-
settingsSchema:
|
|
275
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
227
276
|
status: 'ga',
|
|
228
277
|
contextWindow: 200_000,
|
|
229
278
|
maxOutputTokens: 100_000,
|