@futdevpro/fsm-dynamo 1.16.22 → 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 +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 +60 -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 +62 -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":"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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,22 +20,48 @@ 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
|
};
|
|
@@ -72,11 +98,27 @@ const OAI_CLASSIC_CHAT_SETTINGS = {
|
|
|
72
98
|
},
|
|
73
99
|
};
|
|
74
100
|
/**
|
|
75
|
-
*
|
|
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'],
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
76
114
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
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.").
|
|
80
122
|
*/
|
|
81
123
|
const OAI_EMBEDDING_SETTINGS_SMALL = {
|
|
82
124
|
unsupported: ['temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens'],
|
|
@@ -108,7 +150,7 @@ exports.DyFM_OAI_Models = [
|
|
|
108
150
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
109
151
|
displayName: 'GPT-5.5',
|
|
110
152
|
tier: 'flagship',
|
|
111
|
-
settingsSchema:
|
|
153
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
112
154
|
status: 'ga',
|
|
113
155
|
contextWindow: 1_050_000,
|
|
114
156
|
maxOutputTokens: 128_000,
|
|
@@ -130,7 +172,7 @@ exports.DyFM_OAI_Models = [
|
|
|
130
172
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
131
173
|
displayName: 'GPT-5.5 Pro',
|
|
132
174
|
tier: 'pro',
|
|
133
|
-
settingsSchema:
|
|
175
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
134
176
|
status: 'ga',
|
|
135
177
|
contextWindow: 1_050_000,
|
|
136
178
|
maxOutputTokens: 128_000,
|
|
@@ -152,7 +194,7 @@ exports.DyFM_OAI_Models = [
|
|
|
152
194
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
153
195
|
displayName: 'GPT-5.4',
|
|
154
196
|
tier: 'flagship',
|
|
155
|
-
settingsSchema:
|
|
197
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
156
198
|
status: 'ga',
|
|
157
199
|
contextWindow: 1_000_000,
|
|
158
200
|
maxOutputTokens: 128_000,
|
|
@@ -174,7 +216,7 @@ exports.DyFM_OAI_Models = [
|
|
|
174
216
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
175
217
|
displayName: 'GPT-5.4 mini',
|
|
176
218
|
tier: 'mini',
|
|
177
|
-
settingsSchema:
|
|
219
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
178
220
|
status: 'ga',
|
|
179
221
|
contextWindow: 400_000,
|
|
180
222
|
maxOutputTokens: 128_000,
|
|
@@ -196,7 +238,7 @@ exports.DyFM_OAI_Models = [
|
|
|
196
238
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
197
239
|
displayName: 'GPT-5.4 nano',
|
|
198
240
|
tier: 'nano',
|
|
199
|
-
settingsSchema:
|
|
241
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
200
242
|
status: 'ga',
|
|
201
243
|
contextWindow: 400_000,
|
|
202
244
|
maxOutputTokens: 128_000,
|
|
@@ -218,7 +260,7 @@ exports.DyFM_OAI_Models = [
|
|
|
218
260
|
modelType: ai_model_type_enum_1.DyFM_AI_ModelType.Chat,
|
|
219
261
|
displayName: 'o3-pro',
|
|
220
262
|
tier: 'pro',
|
|
221
|
-
settingsSchema:
|
|
263
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
222
264
|
status: 'ga',
|
|
223
265
|
contextWindow: 200_000,
|
|
224
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
|
+
})();
|
|
@@ -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,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
|
};
|
|
@@ -75,11 +102,28 @@ const OAI_CLASSIC_CHAT_SETTINGS: DyFM_AI_ModelSettingsSchema = {
|
|
|
75
102
|
};
|
|
76
103
|
|
|
77
104
|
/**
|
|
78
|
-
*
|
|
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' ],
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Embedding models: the one real knob is `dimensions`.
|
|
79
119
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
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.").
|
|
83
127
|
*/
|
|
84
128
|
const OAI_EMBEDDING_SETTINGS_SMALL: DyFM_AI_ModelSettingsSchema = {
|
|
85
129
|
unsupported: [ 'temperature', 'topP', 'frequencyPenalty', 'presencePenalty', 'maxTokens' ],
|
|
@@ -113,7 +157,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
113
157
|
modelType: DyFM_AI_ModelType.Chat,
|
|
114
158
|
displayName: 'GPT-5.5',
|
|
115
159
|
tier: 'flagship',
|
|
116
|
-
settingsSchema:
|
|
160
|
+
settingsSchema: OAI_SAMPLING_REJECTED,
|
|
117
161
|
status: 'ga',
|
|
118
162
|
contextWindow: 1_050_000,
|
|
119
163
|
maxOutputTokens: 128_000,
|
|
@@ -135,7 +179,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
135
179
|
modelType: DyFM_AI_ModelType.Chat,
|
|
136
180
|
displayName: 'GPT-5.5 Pro',
|
|
137
181
|
tier: 'pro',
|
|
138
|
-
settingsSchema:
|
|
182
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
139
183
|
status: 'ga',
|
|
140
184
|
contextWindow: 1_050_000,
|
|
141
185
|
maxOutputTokens: 128_000,
|
|
@@ -157,7 +201,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
157
201
|
modelType: DyFM_AI_ModelType.Chat,
|
|
158
202
|
displayName: 'GPT-5.4',
|
|
159
203
|
tier: 'flagship',
|
|
160
|
-
settingsSchema:
|
|
204
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
161
205
|
status: 'ga',
|
|
162
206
|
contextWindow: 1_000_000,
|
|
163
207
|
maxOutputTokens: 128_000,
|
|
@@ -179,7 +223,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
179
223
|
modelType: DyFM_AI_ModelType.Chat,
|
|
180
224
|
displayName: 'GPT-5.4 mini',
|
|
181
225
|
tier: 'mini',
|
|
182
|
-
settingsSchema:
|
|
226
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
183
227
|
status: 'ga',
|
|
184
228
|
contextWindow: 400_000,
|
|
185
229
|
maxOutputTokens: 128_000,
|
|
@@ -201,7 +245,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
201
245
|
modelType: DyFM_AI_ModelType.Chat,
|
|
202
246
|
displayName: 'GPT-5.4 nano',
|
|
203
247
|
tier: 'nano',
|
|
204
|
-
settingsSchema:
|
|
248
|
+
settingsSchema: OAI_SAMPLING_ACCEPTED,
|
|
205
249
|
status: 'ga',
|
|
206
250
|
contextWindow: 400_000,
|
|
207
251
|
maxOutputTokens: 128_000,
|
|
@@ -223,7 +267,7 @@ export const DyFM_OAI_Models: DyFM_AI_ModelInfo[] = [
|
|
|
223
267
|
modelType: DyFM_AI_ModelType.Chat,
|
|
224
268
|
displayName: 'o3-pro',
|
|
225
269
|
tier: 'pro',
|
|
226
|
-
settingsSchema:
|
|
270
|
+
settingsSchema: OAI_SAMPLING_UNVERIFIED,
|
|
227
271
|
status: 'ga',
|
|
228
272
|
contextWindow: 200_000,
|
|
229
273
|
maxOutputTokens: 100_000,
|