@ggui-ai/protocol 0.5.0-rc.2 → 0.6.0
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/dist/gadgets/stdlib-gadgets.d.ts +1 -1
- package/dist/gadgets/stdlib-gadgets.d.ts.map +1 -1
- package/dist/gadgets/stdlib-gadgets.js +1 -1
- package/dist/types/llm-route.d.ts +4 -4
- package/dist/types/llm-route.js +5 -5
- package/dist/types/llm.d.ts +15 -2
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/llm.js +133 -1
- package/dist/validation/contract-validator.js +1 -1
- package/package.json +1 -1
|
@@ -12,7 +12,7 @@ export declare const STDLIB_GADGETS_PACKAGE = "@ggui-ai/gadgets";
|
|
|
12
12
|
* in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
|
|
13
13
|
* bump to the runtime package without updating this constant fails CI.
|
|
14
14
|
*/
|
|
15
|
-
export declare const STDLIB_GADGETS_VERSION = "0.
|
|
15
|
+
export declare const STDLIB_GADGETS_VERSION = "0.6.0";
|
|
16
16
|
/**
|
|
17
17
|
* v1 catalog of stdlib gadget descriptors. Every entry's
|
|
18
18
|
* `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdlib-gadgets.d.ts","sourceRoot":"","sources":["../../src/gadgets/stdlib-gadgets.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"stdlib-gadgets.d.ts","sourceRoot":"","sources":["../../src/gadgets/stdlib-gadgets.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,UAAU,CAAC;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,QAAQ,CAAC,gBAAgB,CAAC,EAkH/D,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUnD,CAAC"}
|
|
@@ -39,7 +39,7 @@ export const STDLIB_GADGETS_PACKAGE = '@ggui-ai/gadgets';
|
|
|
39
39
|
* in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
|
|
40
40
|
* bump to the runtime package without updating this constant fails CI.
|
|
41
41
|
*/
|
|
42
|
-
export const STDLIB_GADGETS_VERSION = '0.
|
|
42
|
+
export const STDLIB_GADGETS_VERSION = '0.6.0';
|
|
43
43
|
/**
|
|
44
44
|
* v1 catalog of stdlib gadget descriptors. Every entry's
|
|
45
45
|
* `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
|
|
@@ -175,8 +175,8 @@ export declare function isValidLlmRoute(provider: string, model: string): boolea
|
|
|
175
175
|
* → `'anthropic:claude-haiku-4-5-20251001'`
|
|
176
176
|
* `{provider: 'bedrock', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'}`
|
|
177
177
|
* → `'bedrock:us.anthropic.claude-haiku-4-5-20251001-v1:0'`
|
|
178
|
-
* `{provider: 'openrouter', model: 'anthropic/claude-
|
|
179
|
-
* → `'openrouter:anthropic/claude-
|
|
178
|
+
* `{provider: 'openrouter', model: 'anthropic/claude-haiku-4.5'}`
|
|
179
|
+
* → `'openrouter:anthropic/claude-haiku-4.5'`
|
|
180
180
|
*/
|
|
181
181
|
export declare function serializeLlmRoute(route: LlmRoute): string;
|
|
182
182
|
/**
|
|
@@ -200,8 +200,8 @@ export declare function parseLlmRoute(serialized: string): LlmRoute | null;
|
|
|
200
200
|
* - `gemini/gemini-3.5-flash` → `{google, gemini-3.5-flash}`
|
|
201
201
|
* - `openai/gpt-5.5-...` → `{openai, gpt-5.5-...}`
|
|
202
202
|
* - `bedrock/us.anthropic...` → `{bedrock, us.anthropic...}`
|
|
203
|
-
* - `openrouter/anthropic/claude-
|
|
204
|
-
* → `{openrouter, anthropic/claude-
|
|
203
|
+
* - `openrouter/anthropic/claude-haiku-4.5`
|
|
204
|
+
* → `{openrouter, anthropic/claude-haiku-4.5}`
|
|
205
205
|
*
|
|
206
206
|
* Used at wire boundaries (ggui.json parser, CLI flag, env var) so
|
|
207
207
|
* existing operator configs keep working without a forced migration.
|
package/dist/types/llm-route.js
CHANGED
|
@@ -262,7 +262,7 @@ export function isValidLlmRoute(provider, model) {
|
|
|
262
262
|
/**
|
|
263
263
|
* Canonical wire format separator. `:` chosen over `/` because
|
|
264
264
|
* `/` collides with OpenRouter's own `<author>/<model>` form
|
|
265
|
-
* (`openrouter/anthropic/claude-
|
|
265
|
+
* (`openrouter/anthropic/claude-haiku-4.5` has TWO slashes; ambiguous
|
|
266
266
|
* to split). Bedrock's model string also contains `.` and `:` — `:`
|
|
267
267
|
* is fine as the OUTER separator because the inner `:` is always
|
|
268
268
|
* preceded by a `.` or alphanumerics; the FIRST `:` in the serialized
|
|
@@ -279,8 +279,8 @@ const CANONICAL_SEPARATOR = ':';
|
|
|
279
279
|
* → `'anthropic:claude-haiku-4-5-20251001'`
|
|
280
280
|
* `{provider: 'bedrock', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0'}`
|
|
281
281
|
* → `'bedrock:us.anthropic.claude-haiku-4-5-20251001-v1:0'`
|
|
282
|
-
* `{provider: 'openrouter', model: 'anthropic/claude-
|
|
283
|
-
* → `'openrouter:anthropic/claude-
|
|
282
|
+
* `{provider: 'openrouter', model: 'anthropic/claude-haiku-4.5'}`
|
|
283
|
+
* → `'openrouter:anthropic/claude-haiku-4.5'`
|
|
284
284
|
*/
|
|
285
285
|
export function serializeLlmRoute(route) {
|
|
286
286
|
return `${route.provider}${CANONICAL_SEPARATOR}${route.model}`;
|
|
@@ -358,8 +358,8 @@ const LITELLM_TO_WIRE = {
|
|
|
358
358
|
* - `gemini/gemini-3.5-flash` → `{google, gemini-3.5-flash}`
|
|
359
359
|
* - `openai/gpt-5.5-...` → `{openai, gpt-5.5-...}`
|
|
360
360
|
* - `bedrock/us.anthropic...` → `{bedrock, us.anthropic...}`
|
|
361
|
-
* - `openrouter/anthropic/claude-
|
|
362
|
-
* → `{openrouter, anthropic/claude-
|
|
361
|
+
* - `openrouter/anthropic/claude-haiku-4.5`
|
|
362
|
+
* → `{openrouter, anthropic/claude-haiku-4.5}`
|
|
363
363
|
*
|
|
364
364
|
* Used at wire boundaries (ggui.json parser, CLI flag, env var) so
|
|
365
365
|
* existing operator configs keep working without a forced migration.
|
package/dist/types/llm.d.ts
CHANGED
|
@@ -25,14 +25,27 @@
|
|
|
25
25
|
* `LLMProvider` (capital)) were deleted in the slice #43 close-out —
|
|
26
26
|
* routing went through `parseAnyLlmRoute` + typed dispatch.
|
|
27
27
|
*
|
|
28
|
-
* Pricing last verified:
|
|
28
|
+
* Pricing last verified: 2026-08-04 (all three providers re-checked
|
|
29
|
+
* against the vendored LiteLLM snapshot + vendor announcements).
|
|
29
30
|
* Sources:
|
|
30
31
|
* https://docs.anthropic.com/en/docs/about-claude/pricing
|
|
31
32
|
* https://developers.openai.com/api/docs/pricing/
|
|
32
33
|
* https://ai.google.dev/gemini-api/docs/pricing
|
|
34
|
+
*
|
|
35
|
+
* KEEPING THIS HONEST: `costs` here is what the benchmark harness and
|
|
36
|
+
* every cost read price against, and until 2026-07-31 nothing compared
|
|
37
|
+
* it to anything — the vendored-snapshot test only asserted a row
|
|
38
|
+
* EXISTS, and `scripts/check-litellm-pricing-drift.ts` compares the
|
|
39
|
+
* snapshot against upstream, never the registry. That gap let this
|
|
40
|
+
* table sit four months stale while production routed to models it did
|
|
41
|
+
* not even list. The pod's `pricing-tables.test.ts` now asserts every
|
|
42
|
+
* entry's `costs` match the vendored rate (with an explicit, dated
|
|
43
|
+
* PENDING_UPSTREAM allowlist for prices we learn before LiteLLM does).
|
|
44
|
+
* Add a model here and you MUST re-vendor the snapshot in the same
|
|
45
|
+
* slice.
|
|
33
46
|
*/
|
|
34
47
|
import type { LlmProvider } from "./llm-route.js";
|
|
35
|
-
export type ModelId = "anthropic/claude-haiku-4-5" | "anthropic/claude-sonnet-4-6" | "anthropic/claude-opus-4-6" | "gemini/gemini-3.5-flash" | "gemini/gemini-3.1-flash-lite" | "gemini/gemini-3-flash-preview" | "gemini/gemini-3.1-pro-preview" | "openai/gpt-5.3-codex" | "openai/gpt-5.4" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano";
|
|
48
|
+
export type ModelId = "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4-5" | "anthropic/claude-opus-4-7" | "anthropic/claude-sonnet-4-6" | "anthropic/claude-opus-4-6" | "gemini/gemini-3.6-flash" | "gemini/gemini-3.5-flash" | "gemini/gemini-3.5-flash-lite" | "gemini/gemini-3.1-flash-lite" | "gemini/gemini-3-flash-preview" | "gemini/gemini-3.1-pro-preview" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.3-codex" | "openai/gpt-5.4" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano";
|
|
36
49
|
export type ModelTier = "fast" | "balanced" | "premium";
|
|
37
50
|
export interface ModelConfig {
|
|
38
51
|
id: ModelId;
|
package/dist/types/llm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/types/llm.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,MAAM,OAAO,GAEf,0BAA0B,GAC1B,yBAAyB,GACzB,2BAA2B,GAC3B,4BAA4B,GAC5B,2BAA2B,GAC3B,6BAA6B,GAC7B,2BAA2B,GAE3B,yBAAyB,GACzB,yBAAyB,GACzB,8BAA8B,GAC9B,8BAA8B,GAC9B,+BAA+B,GAC/B,+BAA+B,GAE/B,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,sBAAsB,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,qBAAqB,CAAC;AAE1B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB;;;;WAIG;QACH,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAMD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,CAuP9C,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,OAAsC,CAAC"}
|
package/dist/types/llm.js
CHANGED
|
@@ -25,17 +25,76 @@
|
|
|
25
25
|
* `LLMProvider` (capital)) were deleted in the slice #43 close-out —
|
|
26
26
|
* routing went through `parseAnyLlmRoute` + typed dispatch.
|
|
27
27
|
*
|
|
28
|
-
* Pricing last verified:
|
|
28
|
+
* Pricing last verified: 2026-08-04 (all three providers re-checked
|
|
29
|
+
* against the vendored LiteLLM snapshot + vendor announcements).
|
|
29
30
|
* Sources:
|
|
30
31
|
* https://docs.anthropic.com/en/docs/about-claude/pricing
|
|
31
32
|
* https://developers.openai.com/api/docs/pricing/
|
|
32
33
|
* https://ai.google.dev/gemini-api/docs/pricing
|
|
34
|
+
*
|
|
35
|
+
* KEEPING THIS HONEST: `costs` here is what the benchmark harness and
|
|
36
|
+
* every cost read price against, and until 2026-07-31 nothing compared
|
|
37
|
+
* it to anything — the vendored-snapshot test only asserted a row
|
|
38
|
+
* EXISTS, and `scripts/check-litellm-pricing-drift.ts` compares the
|
|
39
|
+
* snapshot against upstream, never the registry. That gap let this
|
|
40
|
+
* table sit four months stale while production routed to models it did
|
|
41
|
+
* not even list. The pod's `pricing-tables.test.ts` now asserts every
|
|
42
|
+
* entry's `costs` match the vendored rate (with an explicit, dated
|
|
43
|
+
* PENDING_UPSTREAM allowlist for prices we learn before LiteLLM does).
|
|
44
|
+
* Add a model here and you MUST re-vendor the snapshot in the same
|
|
45
|
+
* slice.
|
|
33
46
|
*/
|
|
34
47
|
// =============================================================================
|
|
35
48
|
// Model Registry — verified pricing March 2026
|
|
36
49
|
// =============================================================================
|
|
37
50
|
export const MODEL_REGISTRY = {
|
|
38
51
|
// ── Anthropic Claude ──────────────────────────────────────────────
|
|
52
|
+
"anthropic/claude-fable-5": {
|
|
53
|
+
id: "anthropic/claude-fable-5",
|
|
54
|
+
provider: "anthropic",
|
|
55
|
+
displayName: "Claude Fable 5",
|
|
56
|
+
tier: "premium",
|
|
57
|
+
costs: {
|
|
58
|
+
inputPer1M: 10.0,
|
|
59
|
+
outputPer1M: 50.0,
|
|
60
|
+
cacheWritePer1M: 12.5,
|
|
61
|
+
cacheReadPer1M: 1.0,
|
|
62
|
+
},
|
|
63
|
+
maxTokens: 1000000,
|
|
64
|
+
supportsTools: true,
|
|
65
|
+
},
|
|
66
|
+
"anthropic/claude-opus-5": {
|
|
67
|
+
id: "anthropic/claude-opus-5",
|
|
68
|
+
provider: "anthropic",
|
|
69
|
+
displayName: "Claude Opus 5",
|
|
70
|
+
tier: "premium",
|
|
71
|
+
costs: {
|
|
72
|
+
inputPer1M: 5.0,
|
|
73
|
+
outputPer1M: 25.0,
|
|
74
|
+
cacheWritePer1M: 6.25,
|
|
75
|
+
cacheReadPer1M: 0.5,
|
|
76
|
+
},
|
|
77
|
+
maxTokens: 1000000,
|
|
78
|
+
supportsTools: true,
|
|
79
|
+
},
|
|
80
|
+
// NOTE(pricing): $2/$10 is Anthropic's INTRODUCTORY rate, in effect
|
|
81
|
+
// through 2026-08-31; it reverts to $3/$15 on 2026-09-01. Re-check
|
|
82
|
+
// this entry then — the vendored LiteLLM snapshot carries the intro
|
|
83
|
+
// rate too, so the drift guard will not flag the reversion for us.
|
|
84
|
+
"anthropic/claude-sonnet-5": {
|
|
85
|
+
id: "anthropic/claude-sonnet-5",
|
|
86
|
+
provider: "anthropic",
|
|
87
|
+
displayName: "Claude Sonnet 5",
|
|
88
|
+
tier: "balanced",
|
|
89
|
+
costs: {
|
|
90
|
+
inputPer1M: 2.0,
|
|
91
|
+
outputPer1M: 10.0,
|
|
92
|
+
cacheWritePer1M: 2.5,
|
|
93
|
+
cacheReadPer1M: 0.2,
|
|
94
|
+
},
|
|
95
|
+
maxTokens: 1000000,
|
|
96
|
+
supportsTools: true,
|
|
97
|
+
},
|
|
39
98
|
// Default generation model (ui-gen's default engine; see
|
|
40
99
|
// DEFAULT_MODEL below). Hosted pools default here too.
|
|
41
100
|
"anthropic/claude-haiku-4-5": {
|
|
@@ -66,6 +125,20 @@ export const MODEL_REGISTRY = {
|
|
|
66
125
|
maxTokens: 200000,
|
|
67
126
|
supportsTools: true,
|
|
68
127
|
},
|
|
128
|
+
"anthropic/claude-opus-4-7": {
|
|
129
|
+
id: "anthropic/claude-opus-4-7",
|
|
130
|
+
provider: "anthropic",
|
|
131
|
+
displayName: "Claude Opus 4.7",
|
|
132
|
+
tier: "premium",
|
|
133
|
+
costs: {
|
|
134
|
+
inputPer1M: 5.0,
|
|
135
|
+
outputPer1M: 25.0,
|
|
136
|
+
cacheWritePer1M: 6.25,
|
|
137
|
+
cacheReadPer1M: 0.5,
|
|
138
|
+
},
|
|
139
|
+
maxTokens: 1000000,
|
|
140
|
+
supportsTools: true,
|
|
141
|
+
},
|
|
69
142
|
"anthropic/claude-opus-4-6": {
|
|
70
143
|
id: "anthropic/claude-opus-4-6",
|
|
71
144
|
provider: "anthropic",
|
|
@@ -85,6 +158,16 @@ export const MODEL_REGISTRY = {
|
|
|
85
158
|
// (https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json);
|
|
86
159
|
// host-side consumers may apply a more authoritative price table
|
|
87
160
|
// if they ship one.
|
|
161
|
+
"gemini/gemini-3.6-flash": {
|
|
162
|
+
id: "gemini/gemini-3.6-flash",
|
|
163
|
+
provider: "google",
|
|
164
|
+
displayName: "Gemini 3.6 Flash",
|
|
165
|
+
tier: "fast",
|
|
166
|
+
costs: { inputPer1M: 1.5, outputPer1M: 7.5, cacheReadPer1M: 0.15 },
|
|
167
|
+
maxTokens: 1048576,
|
|
168
|
+
supportsTools: true,
|
|
169
|
+
supportsCaching: true,
|
|
170
|
+
},
|
|
88
171
|
"gemini/gemini-3.5-flash": {
|
|
89
172
|
id: "gemini/gemini-3.5-flash",
|
|
90
173
|
provider: "google",
|
|
@@ -95,6 +178,17 @@ export const MODEL_REGISTRY = {
|
|
|
95
178
|
supportsTools: true,
|
|
96
179
|
supportsCaching: true,
|
|
97
180
|
},
|
|
181
|
+
// Google-lane generation default (`evaluator.ts`, `generation-probe.ts`).
|
|
182
|
+
"gemini/gemini-3.5-flash-lite": {
|
|
183
|
+
id: "gemini/gemini-3.5-flash-lite",
|
|
184
|
+
provider: "google",
|
|
185
|
+
displayName: "Gemini 3.5 Flash Lite",
|
|
186
|
+
tier: "fast",
|
|
187
|
+
costs: { inputPer1M: 0.3, outputPer1M: 2.5, cacheReadPer1M: 0.03 },
|
|
188
|
+
maxTokens: 1048576,
|
|
189
|
+
supportsTools: true,
|
|
190
|
+
supportsCaching: true,
|
|
191
|
+
},
|
|
98
192
|
// Google-lane reference model (cost-per-token floor).
|
|
99
193
|
"gemini/gemini-3.1-flash-lite": {
|
|
100
194
|
id: "gemini/gemini-3.1-flash-lite",
|
|
@@ -124,6 +218,44 @@ export const MODEL_REGISTRY = {
|
|
|
124
218
|
supportsTools: true,
|
|
125
219
|
},
|
|
126
220
|
// ── OpenAI ────────────────────────────────────────────────────────
|
|
221
|
+
// GPT-5.6 family (2026-07). OpenAI cut Luna 80% and Terra 20% on
|
|
222
|
+
// 2026-07-30; Sol was left unchanged. The 2026-08-04 re-vendor
|
|
223
|
+
// confirmed upstream LiteLLM has ingested both cuts, so these costs
|
|
224
|
+
// now agree with the vendored snapshot (no PENDING_UPSTREAM
|
|
225
|
+
// exemption needed).
|
|
226
|
+
"openai/gpt-5.6-sol": {
|
|
227
|
+
id: "openai/gpt-5.6-sol",
|
|
228
|
+
provider: "openai",
|
|
229
|
+
displayName: "GPT-5.6 Sol",
|
|
230
|
+
tier: "premium",
|
|
231
|
+
costs: {
|
|
232
|
+
inputPer1M: 5.0,
|
|
233
|
+
outputPer1M: 30.0,
|
|
234
|
+
cacheWritePer1M: 6.25,
|
|
235
|
+
cacheReadPer1M: 0.5,
|
|
236
|
+
},
|
|
237
|
+
maxTokens: 1050000,
|
|
238
|
+
supportsTools: true,
|
|
239
|
+
},
|
|
240
|
+
"openai/gpt-5.6-terra": {
|
|
241
|
+
id: "openai/gpt-5.6-terra",
|
|
242
|
+
provider: "openai",
|
|
243
|
+
displayName: "GPT-5.6 Terra",
|
|
244
|
+
tier: "balanced",
|
|
245
|
+
costs: { inputPer1M: 2.0, outputPer1M: 12.0, cacheReadPer1M: 0.2 },
|
|
246
|
+
maxTokens: 1050000,
|
|
247
|
+
supportsTools: true,
|
|
248
|
+
},
|
|
249
|
+
// OpenAI-lane generation default (`evaluator.ts`, `generation-probe.ts`).
|
|
250
|
+
"openai/gpt-5.6-luna": {
|
|
251
|
+
id: "openai/gpt-5.6-luna",
|
|
252
|
+
provider: "openai",
|
|
253
|
+
displayName: "GPT-5.6 Luna",
|
|
254
|
+
tier: "fast",
|
|
255
|
+
costs: { inputPer1M: 0.2, outputPer1M: 1.2, cacheReadPer1M: 0.02 },
|
|
256
|
+
maxTokens: 1050000,
|
|
257
|
+
supportsTools: true,
|
|
258
|
+
},
|
|
127
259
|
"openai/gpt-5.3-codex": {
|
|
128
260
|
id: "openai/gpt-5.3-codex",
|
|
129
261
|
provider: "openai",
|
|
@@ -563,7 +563,7 @@ export function validateContractStructure(contract) {
|
|
|
563
563
|
}
|
|
564
564
|
// Schema-compat invariants: action.schema ⊆ tool.inputSchema and
|
|
565
565
|
// channel.schema ⊇ tool.outputSchema, validated against the
|
|
566
|
-
// contract's OWN
|
|
566
|
+
// contract's OWN agentCapabilities.tools catalog. Distinct scope from the
|
|
567
567
|
// server-level F4 check (which compares against the live tool
|
|
568
568
|
// registry's zod schemas).
|
|
569
569
|
for (const violation of checkSchemaCompat(contract)) {
|