@@ -152,54 +152,13 @@ const addSystemPrompt = async (
152152
153153 const queryText = mode !== "profile" ? getLastUserMessage ( messages ) : ""
154154
155- const memoriesResponse = await supermemoryProfileSearch (
156- containerTag ,
155+ const memories = await searchAndFormatMemories (
157156 queryText ,
158- )
159-
160- const memoryCountStatic = memoriesResponse . profile . static ?. length || 0
161- const memoryCountDynamic = memoriesResponse . profile . dynamic ?. length || 0
162-
163- logger . info ( "Memory search completed" , {
164157 containerTag ,
165- memoryCountStatic,
166- memoryCountDynamic,
167- queryText :
168- queryText . substring ( 0 , 100 ) + ( queryText . length > 100 ? "..." : "" ) ,
158+ logger ,
169159 mode ,
170- } )
171-
172- const profileData =
173- mode !== "query"
174- ? convertProfileToMarkdown ( {
175- profile : {
176- static : memoriesResponse . profile . static ?. map ( ( item ) => item . memory ) ,
177- dynamic : memoriesResponse . profile . dynamic ?. map (
178- ( item ) => item . memory ,
179- ) ,
180- } ,
181- searchResults : {
182- results : memoriesResponse . searchResults . results . map ( ( item ) => ( {
183- memory : item . memory ,
184- } ) ) as [ { memory : string } ] ,
185- } ,
186- } )
187- : ""
188- const searchResultsMemories =
189- mode !== "profile"
190- ? `Search results for user's recent message: \n${ memoriesResponse . searchResults . results
191- . map ( ( result ) => `- ${ result . memory } ` )
192- . join ( "\n" ) } `
193- : ""
194-
195- const memories = `${ profileData } \n${ searchResultsMemories } ` . trim ( )
196-
197- if ( memories ) {
198- logger . debug ( "Memory content preview" , {
199- content : memories ,
200- fullLength : memories . length ,
201- } )
202- }
160+ "chat" ,
161+ )
203162
204163 if ( systemPromptExists ) {
205164 logger . debug ( "Added memories to existing system prompt" )
@@ -338,27 +297,145 @@ export function createOpenAIMiddleware(
338297 apiKey : process . env . SUPERMEMORY_API_KEY ,
339298 } )
340299
300+ const conversationId = options ?. conversationId
301+ const mode = options ?. mode ?? "profile"
302+ const addMemory = options ?. addMemory ?? "never"
303+
341304 const originalCreate = openaiClient . chat . completions . create
305+ const originalResponsesCreate = openaiClient . responses ?. create
306+
307+ /**
308+ * Searches for memories and formats them for injection into API calls.
309+ *
310+ * This shared function handles memory search and formatting for both Chat Completions
311+ * and Responses APIs, reducing code duplication.
312+ *
313+ * @param queryText - The text to search for (empty string for profile-only mode)
314+ * @param containerTag - The container tag for memory search
315+ * @param logger - Logger instance
316+ * @param mode - Memory search mode
317+ * @param context - API context for logging differentiation
318+ * @returns Formatted memories string
319+ */
320+ const searchAndFormatMemories = async (
321+ queryText : string ,
322+ containerTag : string ,
323+ logger : Logger ,
324+ mode : "profile" | "query" | "full" ,
325+ context : "chat" | "responses" ,
326+ ) => {
327+ const memoriesResponse = await supermemoryProfileSearch (
328+ containerTag ,
329+ queryText ,
330+ )
342331
343- const createWithMemory = async (
344- params : OpenAI . Chat . Completions . ChatCompletionCreateParams ,
332+ const memoryCountStatic = memoriesResponse . profile . static ?. length || 0
333+ const memoryCountDynamic = memoriesResponse . profile . dynamic ?. length || 0
334+
335+ logger . info ( `Memory search completed for ${ context } API` , {
336+ containerTag,
337+ memoryCountStatic,
338+ memoryCountDynamic,
339+ queryText :
340+ queryText . substring ( 0 , 100 ) + ( queryText . length > 100 ? "..." : "" ) ,
341+ mode,
342+ } )
343+
344+ const profileData =
345+ mode !== "query"
346+ ? convertProfileToMarkdown ( {
347+ profile : {
348+ static : memoriesResponse . profile . static ?. map ( ( item ) => item . memory ) ,
349+ dynamic : memoriesResponse . profile . dynamic ?. map (
350+ ( item ) => item . memory ,
351+ ) ,
352+ } ,
353+ searchResults : {
354+ results : memoriesResponse . searchResults . results . map ( ( item ) => ( {
355+ memory : item . memory ,
356+ } ) ) as [ { memory : string } ] ,
357+ } ,
358+ } )
359+ : ""
360+ const searchResultsMemories =
361+ mode !== "profile"
362+ ? `Search results for user's ${ context === "chat" ? "recent message" : "input" } : \n${ memoriesResponse . searchResults . results
363+ . map ( ( result ) => `- ${ result . memory } ` )
364+ . join ( "\n" ) } `
365+ : ""
366+
367+ const memories = `${ profileData } \n${ searchResultsMemories } ` . trim ( )
368+
369+ if ( memories ) {
370+ logger . debug ( `Memory content preview for ${ context } API` , {
371+ content : memories ,
372+ fullLength : memories . length ,
373+ } )
374+ }
375+
376+ return memories
377+ }
378+
379+ const createResponsesWithMemory = async (
380+ params : Parameters < typeof originalResponsesCreate > [ 0 ] ,
345381 ) => {
346- const messages = Array . isArray ( params . messages ) ? params . messages : [ ]
382+ if ( ! originalResponsesCreate ) {
383+ throw new Error ( "Responses API is not available in this OpenAI client version" )
384+ }
347385
348- if ( addMemory === "always" ) {
349- const userMessage = getLastUserMessage ( messages )
350- if ( userMessage ?. trim ( ) ) {
351- const content = conversationId
352- ? getConversationContent ( messages )
353- : userMessage
354- const customId = conversationId
355- ? `conversation:${ conversationId } `
356- : undefined
386+ const input = typeof params . input === "string" ? params . input : ""
357387
358- addMemoryTool ( client , containerTag , content , customId , logger )
359- }
388+ if ( mode !== "profile" && ! input ) {
389+ logger . debug ( "No input found for Responses API, skipping memory search" )
390+ return originalResponsesCreate . call ( openaiClient . responses , params )
360391 }
361392
393+ logger . info ( "Starting memory search for Responses API" , {
394+ containerTag,
395+ conversationId,
396+ mode,
397+ } )
398+
399+ const operations : Promise < any > [ ] = [ ]
400+
401+ if ( addMemory === "always" && input ?. trim ( ) ) {
402+ const content = conversationId
403+ ? `Input: ${ input } `
404+ : input
405+ const customId = conversationId
406+ ? `conversation:${ conversationId } `
407+ : undefined
408+
409+ operations . push ( addMemoryTool ( client , containerTag , content , customId , logger ) )
410+ }
411+
412+ const queryText = mode !== "profile" ? input : ""
413+ operations . push ( searchAndFormatMemories (
414+ queryText ,
415+ containerTag ,
416+ logger ,
417+ mode ,
418+ "responses" ,
419+ ) )
420+
421+ const results = await Promise . all ( operations )
422+ const memories = results [ results . length - 1 ] // Memory search result is always last
423+
424+ const enhancedInstructions = memories
425+ ? `${ params . instructions || "" } \n\n${ memories } ` . trim ( )
426+ : params . instructions
427+
428+ return originalResponsesCreate . call ( openaiClient . responses , {
429+ ...params ,
430+ instructions : enhancedInstructions ,
431+ } )
432+ }
433+
434+ const createWithMemory = async (
435+ params : OpenAI . Chat . Completions . ChatCompletionCreateParams ,
436+ ) => {
437+ const messages = Array . isArray ( params . messages ) ? params . messages : [ ]
438+
362439 if ( mode !== "profile" ) {
363440 const userMessage = getLastUserMessage ( messages )
364441 if ( ! userMessage ) {
@@ -373,12 +450,31 @@ export function createOpenAIMiddleware(
373450 mode,
374451 } )
375452
376- const enhancedMessages = await addSystemPrompt (
453+ const operations : Promise < any > [ ] = [ ]
454+
455+ if ( addMemory === "always" ) {
456+ const userMessage = getLastUserMessage ( messages )
457+ if ( userMessage ?. trim ( ) ) {
458+ const content = conversationId
459+ ? getConversationContent ( messages )
460+ : userMessage
461+ const customId = conversationId
462+ ? `conversation:${ conversationId } `
463+ : undefined
464+
465+ operations . push ( addMemoryTool ( client , containerTag , content , customId , logger ) )
466+ }
467+ }
468+
469+ operations . push ( addSystemPrompt (
377470 messages ,
378471 containerTag ,
379472 logger ,
380473 mode ,
381- )
474+ ) )
475+
476+ const results = await Promise . all ( operations )
477+ const enhancedMessages = results [ results . length - 1 ] // Enhanced messages result is always last
382478
383479 return originalCreate . call ( openaiClient . chat . completions , {
384480 ...params ,
@@ -389,5 +485,11 @@ export function createOpenAIMiddleware(
389485 openaiClient . chat . completions . create =
390486 createWithMemory as typeof originalCreate
391487
488+ // Wrap Responses API if available
489+ if ( originalResponsesCreate ) {
490+ openaiClient . responses . create =
491+ createResponsesWithMemory as typeof originalResponsesCreate
492+ }
493+
392494 return openaiClient
393495}
0 commit comments