@@ -2,6 +2,12 @@ import type { ModelCompatConfig } from "../config/types.models.js";
22import { shouldOmitEmptyArrayItems } from "../plugins/provider-model-compat.js" ;
33import { normalizeToolParameterSchema } from "./agent-tools-parameter-schema.js" ;
44
5+ /**
6+ * OpenAI strict-tool-schema normalization and diagnostics.
7+ *
8+ * Strict schemas need all object properties required and `additionalProperties: false`; model
9+ * compatibility settings can also remove unsupported schema constructs before strict checks run.
10+ */
511type ToolSchemaCompatInput = {
612 unsupportedToolSchemaKeywords ?: unknown ;
713 omitEmptyArrayItems ?: unknown ;
@@ -65,6 +71,7 @@ export function clearOpenAIToolSchemaCacheForTest(): void {
6571 strictOpenAISchemaCache = new WeakMap ( ) ;
6672}
6773
74+ /** Normalizes a tool parameter schema into the OpenAI strict JSON-schema subset. */
6875export function normalizeStrictOpenAIJsonSchema (
6976 schema : unknown ,
7077 modelCompat ?: ToolSchemaCompatInput | null ,
@@ -86,6 +93,8 @@ export function normalizeStrictOpenAIJsonSchema(
8693 return rememberStrictOpenAISchema (
8794 schemaInput ,
8895 cacheKey ,
96+ // Cache by input object and compatibility key so repeated inventory generation preserves object
97+ // identity without mixing schemas normalized for different provider limitations.
8998 normalizeStrictOpenAIJsonSchemaRecursive (
9099 normalizeToolParameterSchema ( schemaInput , {
91100 modelCompat : resolveToolSchemaModelCompat ( modelCompat ) ,
@@ -141,6 +150,7 @@ function normalizeStrictOpenAIJsonSchemaRecursive(schema: unknown, depth: number
141150 return changed ? normalized : schema ;
142151}
143152
153+ /** Normalizes tool parameters using strict OpenAI rules only when strict mode is active. */
144154export function normalizeOpenAIStrictToolParameters < T > (
145155 schema : T ,
146156 strict : boolean ,
@@ -153,6 +163,7 @@ export function normalizeOpenAIStrictToolParameters<T>(
153163 return normalizeStrictOpenAIJsonSchema ( schema , toolSchemaCompat ) as T ;
154164}
155165
166+ /** Returns whether a schema already satisfies OpenAI strict tool-schema constraints. */
156167export function isStrictOpenAIJsonSchemaCompatible ( schema : unknown ) : boolean {
157168 return isStrictOpenAIJsonSchemaCompatibleRecursive ( normalizeStrictOpenAIJsonSchema ( schema ) ) ;
158169}
@@ -163,6 +174,7 @@ type OpenAIStrictToolSchemaDiagnostic = {
163174 violations : string [ ] ;
164175} ;
165176
177+ /** Returns strict-schema violation paths for each incompatible tool definition. */
166178export function findOpenAIStrictToolSchemaDiagnostics (
167179 tools : readonly ToolWithParameters [ ] ,
168180) : OpenAIStrictToolSchemaDiagnostic [ ] {
@@ -297,6 +309,7 @@ function findStrictOpenAIJsonSchemaViolations(schema: unknown, path: string): st
297309 return violations ;
298310}
299311
312+ /** Resolves the strict flag to advertise for a tool inventory after compatibility checks. */
300313export function resolveOpenAIStrictToolFlagForInventory (
301314 tools : readonly ToolWithParameters [ ] ,
302315 strict : boolean | null | undefined ,
0 commit comments