@@ -14,6 +14,7 @@ type ToolWithParameters = {
1414
1515const MAX_STRICT_SCHEMA_CACHE_ENTRIES_PER_SCHEMA = 8 ;
1616let strictOpenAISchemaCache = new WeakMap < object , Array < { key : string ; value : unknown } > > ( ) ;
17+ let openAISchemaInputCache = new WeakMap < object , unknown > ( ) ;
1718
1819function resolveToolSchemaModelCompat (
1920 compat : ToolSchemaCompatInput | null | undefined ,
@@ -63,13 +64,33 @@ function rememberStrictOpenAISchema(schema: object, key: string, value: unknown)
6364
6465export function clearOpenAIToolSchemaCacheForTest ( ) : void {
6566 strictOpenAISchemaCache = new WeakMap ( ) ;
67+ openAISchemaInputCache = new WeakMap ( ) ;
68+ }
69+
70+ function materializeOpenAIToolSchemaInput ( schema : unknown ) : unknown {
71+ const schemaInput = schema ?? { } ;
72+ if ( ! schemaInput || typeof schemaInput !== "object" ) {
73+ return schemaInput ;
74+ }
75+ if ( openAISchemaInputCache . has ( schemaInput ) ) {
76+ return openAISchemaInputCache . get ( schemaInput ) ;
77+ }
78+ let materialized : unknown ;
79+ try {
80+ const text = JSON . stringify ( schemaInput ) ;
81+ materialized = text ? JSON . parse ( text ) : { } ;
82+ } catch {
83+ materialized = { } ;
84+ }
85+ openAISchemaInputCache . set ( schemaInput , materialized ) ;
86+ return materialized ;
6687}
6788
6889export function normalizeStrictOpenAIJsonSchema (
6990 schema : unknown ,
7091 modelCompat ?: ToolSchemaCompatInput | null ,
7192) : unknown {
72- const schemaInput = schema ?? { } ;
93+ const schemaInput = materializeOpenAIToolSchemaInput ( schema ) ;
7394 if ( ! schemaInput || typeof schemaInput !== "object" ) {
7495 return normalizeStrictOpenAIJsonSchemaRecursive (
7596 normalizeToolParameterSchema ( schemaInput , {
@@ -147,10 +168,11 @@ export function normalizeOpenAIStrictToolParameters<T>(
147168 modelCompat ?: ToolSchemaCompatInput | null ,
148169) : T {
149170 const toolSchemaCompat = resolveToolSchemaModelCompat ( modelCompat ) ;
171+ const schemaInput = materializeOpenAIToolSchemaInput ( schema ) ;
150172 if ( ! strict ) {
151- return normalizeToolParameterSchema ( schema ?? { } , { modelCompat : toolSchemaCompat } ) as T ;
173+ return normalizeToolParameterSchema ( schemaInput ?? { } , { modelCompat : toolSchemaCompat } ) as T ;
152174 }
153- return normalizeStrictOpenAIJsonSchema ( schema , toolSchemaCompat ) as T ;
175+ return normalizeStrictOpenAIJsonSchema ( schemaInput , toolSchemaCompat ) as T ;
154176}
155177
156178export function isStrictOpenAIJsonSchemaCompatible ( schema : unknown ) : boolean {
0 commit comments