From 2c28be50313f6d84683cf9c50a08d59c87d0ea4d Mon Sep 17 00:00:00 2001 From: Paolo Dettori Date: Mon, 24 Aug 2026 16:07:51 -0400 Subject: [PATCH] fix(ai): make model codegen hermetic and widen OpenAIResponsesCompat The build script regenerated src/models.generated.ts and src/image-models.generated.ts from the live models.dev API on every build. When models.dev emits supportsReasoningEffort on a model mapped to the openai-responses API, the regenerated file no longer typechecks against OpenAIResponsesCompat (TS2353), breaking downstream builds in consumers that pin this package as a git submodule. - Split codegen out of build: build now only runs tsgo, so builds are hermetic and use the committed generated files. Regeneration moves to a dedicated generate script, with check:models-drift to verify the committed files are current. - Add supportsReasoningEffort to OpenAIResponsesCompat (and its Required<> defaults in getCompat) so deliberate regeneration stays valid. Assisted-By: Claude (Anthropic AI) Signed-off-by: Paolo Dettori --- packages/ai/package.json | 4 +++- packages/ai/src/providers/openai-responses.ts | 1 + packages/ai/src/types.ts | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/ai/package.json b/packages/ai/package.json index 9a54de2fb..48cb17c59 100644 --- a/packages/ai/package.json +++ b/packages/ai/package.json @@ -62,7 +62,9 @@ "clean": "shx rm -rf dist", "generate-models": "node scripts/generate-models.ts", "generate-image-models": "node scripts/generate-image-models.ts", - "build": "npm run generate-models && npm run generate-image-models && tsgo -p tsconfig.build.json", + "generate": "npm run generate-models && npm run generate-image-models", + "build": "tsgo -p tsconfig.build.json", + "check:models-drift": "npm run generate && git diff --exit-code -- src/models.generated.ts src/image-models.generated.ts", "test": "vitest --run", "prepublishOnly": "npm run clean && npm run build" }, diff --git a/packages/ai/src/providers/openai-responses.ts b/packages/ai/src/providers/openai-responses.ts index 9afeff290..b5cb69c4a 100644 --- a/packages/ai/src/providers/openai-responses.ts +++ b/packages/ai/src/providers/openai-responses.ts @@ -40,6 +40,7 @@ function resolveCacheRetention(cacheRetention?: CacheRetention): CacheRetention function getCompat(model: Model<"openai-responses">): Required { return { supportsDeveloperRole: model.compat?.supportsDeveloperRole ?? true, + supportsReasoningEffort: model.compat?.supportsReasoningEffort ?? true, sendSessionIdHeader: model.compat?.sendSessionIdHeader ?? true, supportsLongCacheRetention: model.compat?.supportsLongCacheRetention ?? true, }; diff --git a/packages/ai/src/types.ts b/packages/ai/src/types.ts index 897e87d96..eab4e8b0e 100644 --- a/packages/ai/src/types.ts +++ b/packages/ai/src/types.ts @@ -423,6 +423,8 @@ export interface OpenAICompletionsCompat { export interface OpenAIResponsesCompat { /** Whether the provider supports the `developer` role (vs `system`). Default: true. */ supportsDeveloperRole?: boolean; + /** Whether the provider supports `reasoning_effort`. Default: true. */ + supportsReasoningEffort?: boolean; /** Whether to send the OpenAI `session_id` cache-affinity header from `options.sessionId` when caching is enabled. Default: true. */ sendSessionIdHeader?: boolean; /** Whether the provider supports `prompt_cache_retention: "24h"`. Default: true. */