@futdevpro/fsm-dynamo 1.16.21 → 1.16.23
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 +25 -3
- 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 +85 -20
- 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 +25 -3
- 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 +87 -20
|
@@ -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"}
|
|
@@ -27,18 +27,40 @@ const AAI_OPUS_SETTINGS = {
|
|
|
27
27
|
supported: ['maxTokens'],
|
|
28
28
|
unsupported: ['temperature', 'topP', 'topK'],
|
|
29
29
|
constraints: {
|
|
30
|
-
maxTokens: {
|
|
30
|
+
maxTokens: {
|
|
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.',
|
|
35
|
+
},
|
|
31
36
|
},
|
|
32
37
|
};
|
|
33
38
|
/**
|
|
34
39
|
* Sonnet / Haiku still ACCEPT the sampling params (only Opus 4.7+ rejects them).
|
|
35
|
-
*
|
|
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
|
+
*
|
|
44
|
+
* **Fontos provider-kulonbseg:** az Anthropic `temperature` maximuma **1.0**, NEM 2.0 mint az OpenAI-nal —
|
|
45
|
+
* egy OpenAI-nal ervenyes `temperature: 1.5` itt ervenytelen. A validator ezt most elkapja.
|
|
46
|
+
* `topP` / `topK`: az API-referencia NEM ad meg szamszeru hatarokat → szandekosan nem kodolunk bele semmit.
|
|
47
|
+
* Forras: platform.claude.com/docs/en/api/messages, verified 2026-07-21.
|
|
36
48
|
*/
|
|
37
49
|
const AAI_STANDARD_SETTINGS = {
|
|
38
50
|
supported: ['temperature', 'maxTokens', 'topP'],
|
|
39
51
|
extraParams: ['topK'],
|
|
40
52
|
constraints: {
|
|
41
|
-
|
|
53
|
+
temperature: {
|
|
54
|
+
min: 0,
|
|
55
|
+
max: 1,
|
|
56
|
+
default: 1,
|
|
57
|
+
note: 'Anthropic: "Defaults to 1.0. Ranges from 0.0 to 1.0." — NOTE: half the OpenAI max (2.0). ' +
|
|
58
|
+
'Source: platform.claude.com/docs/en/api/messages, verified 2026-07-21.',
|
|
59
|
+
},
|
|
60
|
+
maxTokens: {
|
|
61
|
+
note: 'Messages API: "Different models have different maximum values for this parameter" — the per-model ' +
|
|
62
|
+
'cap lives in `maxOutputTokens`. Source: platform.claude.com/docs/en/api/messages, verified 2026-07-21.',
|
|
63
|
+
},
|
|
42
64
|
},
|
|
43
65
|
};
|
|
44
66
|
exports.DyFM_AAI_Models = [
|
|
@@ -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,
|
|
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":"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"}
|
|
@@ -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;AAqJ7E,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAuP9C,CAAC"}
|
|
@@ -20,40 +20,105 @@ 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.4`, `gpt-5.5-pro`, `o3-pro`: the pro-tier models were deliberately NOT probed
|
|
50
|
+
* (cost), and `gpt-5.4` (base) sits between a confirmed-rejecting flagship and a confirmed-accepting
|
|
51
|
+
* mini, so its behaviour genuinely is not known.
|
|
52
|
+
*
|
|
53
|
+
* **Risk direction, stated honestly:** if such a model actually ACCEPTS the params, the reconciler
|
|
54
|
+
* drops them silently → the caller's temperature is quietly ignored. That is the milder failure vs.
|
|
55
|
+
* a hard 400, which is why the conservative side was chosen — but it IS an assumption, not a fact.
|
|
56
|
+
* Resolve by probing these three models (one cheap error-call each).
|
|
57
|
+
*/
|
|
58
|
+
const OAI_SAMPLING_UNVERIFIED = {
|
|
59
|
+
supported: ['maxTokens'],
|
|
60
|
+
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty'],
|
|
61
|
+
extraParams: ['reasoningEffort'],
|
|
62
|
+
constraints: {
|
|
63
|
+
reasoningEffort: {
|
|
64
|
+
note: 'UNVERIFIED (no live capture) — assumption inherited from the FR-047 family-wide rule.',
|
|
39
65
|
},
|
|
40
66
|
},
|
|
41
67
|
};
|
|
42
68
|
/**
|
|
43
69
|
* Non-reasoning chat models (`gpt-4o` family) accept the classic sampling params.
|
|
44
70
|
*
|
|
45
|
-
* Numeric bounds
|
|
46
|
-
*
|
|
71
|
+
* Numeric bounds captured from the official OpenAI API reference
|
|
72
|
+
* (https://developers.openai.com/api/reference — fetched 2026-07-21). The docs state the ranges but
|
|
73
|
+
* do NOT document default values, so no `default` is encoded here (an invented default would be a guess).
|
|
47
74
|
*/
|
|
48
75
|
const OAI_CLASSIC_CHAT_SETTINGS = {
|
|
49
76
|
supported: ['temperature', 'maxTokens', 'topP', 'frequencyPenalty', 'presencePenalty'],
|
|
77
|
+
constraints: {
|
|
78
|
+
temperature: {
|
|
79
|
+
min: 0,
|
|
80
|
+
max: 2,
|
|
81
|
+
note: 'OpenAI: "between 0 and 2". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
82
|
+
},
|
|
83
|
+
topP: {
|
|
84
|
+
min: 0,
|
|
85
|
+
max: 1,
|
|
86
|
+
note: 'OpenAI nucleus sampling: "between 0 and 1". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
87
|
+
},
|
|
88
|
+
frequencyPenalty: {
|
|
89
|
+
min: -2,
|
|
90
|
+
max: 2,
|
|
91
|
+
note: 'OpenAI: "Number between -2.0 and 2.0". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
92
|
+
},
|
|
93
|
+
presencePenalty: {
|
|
94
|
+
min: -2,
|
|
95
|
+
max: 2,
|
|
96
|
+
note: 'OpenAI: "Number between -2.0 and 2.0". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* `gpt-5.4-mini` / `gpt-5.4-nano` — **MEASURABLY ACCEPT** all four sampling params.
|
|
102
|
+
*
|
|
103
|
+
* **Live capture 2026-07-21:** `temperature` / `topP` / `frequencyPenalty` / `presencePenalty` each
|
|
104
|
+
* returned HTTP 200 with `reasoning_tokens: 0`. They therefore behave like classic chat models, NOT
|
|
105
|
+
* like the rejecting reasoning models — despite matching the `/^gpt-5/` pattern that FR-047 used.
|
|
106
|
+
* Bounds are the documented OpenAI ranges (see {@link OAI_CLASSIC_CHAT_SETTINGS}).
|
|
107
|
+
*/
|
|
108
|
+
const OAI_SAMPLING_ACCEPTED = {
|
|
109
|
+
...OAI_CLASSIC_CHAT_SETTINGS,
|
|
110
|
+
extraParams: ['reasoningEffort'],
|
|
50
111
|
};
|
|
51
112
|
/**
|
|
52
|
-
* Embedding models
|
|
113
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
53
114
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
115
|
+
* **Live capture 2026-07-21 — CORRECTION:** the sampling params are **NOT rejected**; sending
|
|
116
|
+
* `temperature` to `/v1/embeddings` returns **HTTP 200 and is silently ignored**. They are still listed
|
|
117
|
+
* under `unsupported` so the reconciler DROPS them (dropping a meaningless param is always safe and
|
|
118
|
+
* keeps requests clean) — but note that this does NOT mean the API would 400. The validator's
|
|
119
|
+
* `unsupported_parameter` error for these is therefore stricter than the live API.
|
|
120
|
+
* Max/default dims: 1536 / 3072 — confirmed by capture
|
|
121
|
+
* ("Invalid value for 'dimensions' = 5000. Must be less than or equal to 1536.").
|
|
57
122
|
*/
|
|
58
123
|
const OAI_EMBEDDING_SETTINGS_SMALL = {
|
|
59
124
|
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens'],
|
|
@@ -85,7 +150,7 @@ exports.DyFM_OAI_Models = [
|
|
|
85
150
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
86
151
|
displayName: 'GPT-5.5',
|
|
87
152
|
tier: 'flagship',
|
|
88
|
-
settingsSchema:
|
|
153
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
89
154
|
status: 'ga',
|
|
90
155
|
contextWindow: 1_050_000,
|
|
91
156
|
maxOutputTokens: 128_000,
|
|
@@ -107,7 +172,7 @@ exports.DyFM_OAI_Models = [
|
|
|
107
172
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
108
173
|
displayName: 'GPT-5.5 Pro',
|
|
109
174
|
tier: 'pro',
|
|
110
|
-
settingsSchema:
|
|
175
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
111
176
|
status: 'ga',
|
|
112
177
|
contextWindow: 1_050_000,
|
|
113
178
|
maxOutputTokens: 128_000,
|
|
@@ -129,7 +194,7 @@ exports.DyFM_OAI_Models = [
|
|
|
129
194
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
130
195
|
displayName: 'GPT-5.4',
|
|
131
196
|
tier: 'flagship',
|
|
132
|
-
settingsSchema:
|
|
197
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
133
198
|
status: 'ga',
|
|
134
199
|
contextWindow: 1_000_000,
|
|
135
200
|
maxOutputTokens: 128_000,
|
|
@@ -151,7 +216,7 @@ exports.DyFM_OAI_Models = [
|
|
|
151
216
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
152
217
|
displayName: 'GPT-5.4 mini',
|
|
153
218
|
tier: 'mini',
|
|
154
|
-
settingsSchema:
|
|
219
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
155
220
|
status: 'ga',
|
|
156
221
|
contextWindow: 400_000,
|
|
157
222
|
maxOutputTokens: 128_000,
|
|
@@ -173,7 +238,7 @@ exports.DyFM_OAI_Models = [
|
|
|
173
238
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
174
239
|
displayName: 'GPT-5.4 nano',
|
|
175
240
|
tier: 'nano',
|
|
176
|
-
settingsSchema:
|
|
241
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
177
242
|
status: 'ga',
|
|
178
243
|
contextWindow: 400_000,
|
|
179
244
|
maxOutputTokens: 128_000,
|
|
@@ -195,7 +260,7 @@ exports.DyFM_OAI_Models = [
|
|
|
195
260
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
196
261
|
displayName: 'o3-pro',
|
|
197
262
|
tier: 'pro',
|
|
198
|
-
settingsSchema:
|
|
263
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
199
264
|
status: 'ga',
|
|
200
265
|
contextWindow: 200_000,
|
|
201
266
|
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.23",
|
|
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
|
+
})();
|
|
@@ -28,19 +28,41 @@ const AAI_OPUS_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
28
28
|
supported: [ 'maxTokens' ],
|
|
29
29
|
unsupported: [ 'temperature', 'topP', 'topK' ],
|
|
30
30
|
constraints: {
|
|
31
|
-
maxTokens: {
|
|
31
|
+
maxTokens: {
|
|
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.',
|
|
36
|
+
},
|
|
32
37
|
},
|
|
33
38
|
};
|
|
34
39
|
|
|
35
40
|
/**
|
|
36
41
|
* Sonnet / Haiku still ACCEPT the sampling params (only Opus 4.7+ rejects them).
|
|
37
|
-
*
|
|
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
|
+
*
|
|
46
|
+
* **Fontos provider-kulonbseg:** az Anthropic `temperature` maximuma **1.0**, NEM 2.0 mint az OpenAI-nal —
|
|
47
|
+
* egy OpenAI-nal ervenyes `temperature: 1.5` itt ervenytelen. A validator ezt most elkapja.
|
|
48
|
+
* `topP` / `topK`: az API-referencia NEM ad meg szamszeru hatarokat → szandekosan nem kodolunk bele semmit.
|
|
49
|
+
* Forras: platform.claude.com/docs/en/api/messages, verified 2026-07-21.
|
|
38
50
|
*/
|
|
39
51
|
const AAI_STANDARD_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
40
52
|
supported: [ 'temperature', 'maxTokens', 'topP' ],
|
|
41
53
|
extraParams: [ 'topK' ],
|
|
42
54
|
constraints: {
|
|
43
|
-
|
|
55
|
+
temperature: {
|
|
56
|
+
min: 0,
|
|
57
|
+
max: 1,
|
|
58
|
+
default: 1,
|
|
59
|
+
note: 'Anthropic: "Defaults to 1.0. Ranges from 0.0 to 1.0." — NOTE: half the OpenAI max (2.0). ' +
|
|
60
|
+
'Source: platform.claude.com/docs/en/api/messages, verified 2026-07-21.',
|
|
61
|
+
},
|
|
62
|
+
maxTokens: {
|
|
63
|
+
note: 'Messages API: "Different models have different maximum values for this parameter" — the per-model ' +
|
|
64
|
+
'cap lives in `maxOutputTokens`. Source: platform.claude.com/docs/en/api/messages, verified 2026-07-21.',
|
|
65
|
+
},
|
|
44
66
|
},
|
|
45
67
|
};
|
|
46
68
|
export const DyFM_AAI_Models: DyFM_AI_ModelInfo[] = [
|
|
@@ -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,49 @@ 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.4`, `gpt-5.5-pro`, `o3-pro`: the pro-tier models were deliberately NOT probed
|
|
52
|
+
* (cost), and `gpt-5.4` (base) sits between a confirmed-rejecting flagship and a confirmed-accepting
|
|
53
|
+
* mini, so its behaviour genuinely is not known.
|
|
54
|
+
*
|
|
55
|
+
* **Risk direction, stated honestly:** if such a model actually ACCEPTS the params, the reconciler
|
|
56
|
+
* drops them silently → the caller's temperature is quietly ignored. That is the milder failure vs.
|
|
57
|
+
* a hard 400, which is why the conservative side was chosen — but it IS an assumption, not a fact.
|
|
58
|
+
* Resolve by probing these three models (one cheap error-call each).
|
|
59
|
+
*/
|
|
60
|
+
const OAI_SAMPLING_UNVERIFIED: DyFM_AI_ModelSettingsSchema = {
|
|
61
|
+
supported: [ 'maxTokens' ],
|
|
62
|
+
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty' ],
|
|
63
|
+
extraParams: [ 'reasoningEffort' ],
|
|
64
|
+
constraints: {
|
|
65
|
+
reasoningEffort: {
|
|
66
|
+
note: 'UNVERIFIED (no live capture) — assumption inherited from the FR-047 family-wide rule.',
|
|
40
67
|
},
|
|
41
68
|
},
|
|
42
69
|
};
|
|
@@ -44,19 +71,59 @@ const OAI_REASONING_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
44
71
|
/**
|
|
45
72
|
* Non-reasoning chat models (`gpt-4o` family) accept the classic sampling params.
|
|
46
73
|
*
|
|
47
|
-
* Numeric bounds
|
|
48
|
-
*
|
|
74
|
+
* Numeric bounds captured from the official OpenAI API reference
|
|
75
|
+
* (https://developers.openai.com/api/reference — fetched 2026-07-21). The docs state the ranges but
|
|
76
|
+
* do NOT document default values, so no `default` is encoded here (an invented default would be a guess).
|
|
49
77
|
*/
|
|
50
78
|
const OAI_CLASSIC_CHAT_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
51
79
|
supported: [ 'temperature', 'maxTokens', 'topP', 'frequencyPenalty', 'presencePenalty' ],
|
|
80
|
+
constraints: {
|
|
81
|
+
temperature: {
|
|
82
|
+
min: 0,
|
|
83
|
+
max: 2,
|
|
84
|
+
note: 'OpenAI: "between 0 and 2". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
85
|
+
},
|
|
86
|
+
topP: {
|
|
87
|
+
min: 0,
|
|
88
|
+
max: 1,
|
|
89
|
+
note: 'OpenAI nucleus sampling: "between 0 and 1". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
90
|
+
},
|
|
91
|
+
frequencyPenalty: {
|
|
92
|
+
min: -2,
|
|
93
|
+
max: 2,
|
|
94
|
+
note: 'OpenAI: "Number between -2.0 and 2.0". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
95
|
+
},
|
|
96
|
+
presencePenalty: {
|
|
97
|
+
min: -2,
|
|
98
|
+
max: 2,
|
|
99
|
+
note: 'OpenAI: "Number between -2.0 and 2.0". Source: developers.openai.com API reference, verified 2026-07-21.',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* `gpt-5.4-mini` / `gpt-5.4-nano` — **MEASURABLY ACCEPT** all four sampling params.
|
|
106
|
+
*
|
|
107
|
+
* **Live capture 2026-07-21:** `temperature` / `topP` / `frequencyPenalty` / `presencePenalty` each
|
|
108
|
+
* returned HTTP 200 with `reasoning_tokens: 0`. They therefore behave like classic chat models, NOT
|
|
109
|
+
* like the rejecting reasoning models — despite matching the `/^gpt-5/` pattern that FR-047 used.
|
|
110
|
+
* Bounds are the documented OpenAI ranges (see {@link OAI_CLASSIC_CHAT_SETTINGS}).
|
|
111
|
+
*/
|
|
112
|
+
const OAI_SAMPLING_ACCEPTED: DyFM_AI_ModelSettingsSchema = {
|
|
113
|
+
...OAI_CLASSIC_CHAT_SETTINGS,
|
|
114
|
+
extraParams: [ 'reasoningEffort' ],
|
|
52
115
|
};
|
|
53
116
|
|
|
54
117
|
/**
|
|
55
|
-
* Embedding models
|
|
118
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
56
119
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
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.").
|
|
60
127
|
*/
|
|
61
128
|
const OAI_EMBEDDING_SETTINGS_SMALL: DyFM_AI_ModelSettingsSchema = {
|
|
62
129
|
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens' ],
|
|
@@ -90,7 +157,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
90
157
|
modelType: DyFM_AI_ModelType.Chat,
|
|
91
158
|
displayName: 'GPT-5.5',
|
|
92
159
|
tier: 'flagship',
|
|
93
|
-
settingsSchema:
|
|
160
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
94
161
|
status: 'ga',
|
|
95
162
|
contextWindow: 1_050_000,
|
|
96
163
|
maxOutputTokens: 128_000,
|
|
@@ -112,7 +179,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
112
179
|
modelType: DyFM_AI_ModelType.Chat,
|
|
113
180
|
displayName: 'GPT-5.5 Pro',
|
|
114
181
|
tier: 'pro',
|
|
115
|
-
settingsSchema:
|
|
182
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
116
183
|
status: 'ga',
|
|
117
184
|
contextWindow: 1_050_000,
|
|
118
185
|
maxOutputTokens: 128_000,
|
|
@@ -134,7 +201,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
134
201
|
modelType: DyFM_AI_ModelType.Chat,
|
|
135
202
|
displayName: 'GPT-5.4',
|
|
136
203
|
tier: 'flagship',
|
|
137
|
-
settingsSchema:
|
|
204
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
138
205
|
status: 'ga',
|
|
139
206
|
contextWindow: 1_000_000,
|
|
140
207
|
maxOutputTokens: 128_000,
|
|
@@ -156,7 +223,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
156
223
|
modelType: DyFM_AI_ModelType.Chat,
|
|
157
224
|
displayName: 'GPT-5.4 mini',
|
|
158
225
|
tier: 'mini',
|
|
159
|
-
settingsSchema:
|
|
226
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
160
227
|
status: 'ga',
|
|
161
228
|
contextWindow: 400_000,
|
|
162
229
|
maxOutputTokens: 128_000,
|
|
@@ -178,7 +245,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
178
245
|
modelType: DyFM_AI_ModelType.Chat,
|
|
179
246
|
displayName: 'GPT-5.4 nano',
|
|
180
247
|
tier: 'nano',
|
|
181
|
-
settingsSchema:
|
|
248
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
182
249
|
status: 'ga',
|
|
183
250
|
contextWindow: 400_000,
|
|
184
251
|
maxOutputTokens: 128_000,
|
|
@@ -200,7 +267,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
200
267
|
modelType: DyFM_AI_ModelType.Chat,
|
|
201
268
|
displayName: 'o3-pro',
|
|
202
269
|
tier: 'pro',
|
|
203
|
-
settingsSchema:
|
|
270
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
204
271
|
status: 'ga',
|
|
205
272
|
contextWindow: 200_000,
|
|
206
273
|
maxOutputTokens: 100_000,
|