{"record":{"id":"990aefe9738bf077","repo":"mastra-ai/mastra","slug":"openaisdkagent-resumedata-must-include-previousres","errorCode":null,"errorMessage":"OpenAISDKAgent resumeData must include previousResponseId, conversationId, or session.","messagePattern":"OpenAISDKAgent resumeData must include previousResponseId, conversationId, or session\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agent-sdks/openai/src/index.ts","lineNumber":257,"sourceCode":"): OpenAIStructuredOutputOption<OUTPUT> | undefined {\n  return options?.structuredOutput as OpenAIStructuredOutputOption<OUTPUT> | undefined;\n}\n\nfunction validateOpenAIResumeData(resumeData: OpenAISDKAgentResumeData): OpenAISDKAgentResumeData {\n  const record = toRecord(resumeData);\n  if (!record || !('message' in record)) {\n    throw new Error('OpenAISDKAgent resumeData must include a message.');\n  }\n\n  if (\n    typeof resumeData.previousResponseId === 'string' ||\n    typeof resumeData.conversationId === 'string' ||\n    resumeData.session !== undefined\n  ) {\n    return resumeData;\n  }\n\n  throw new Error('OpenAISDKAgent resumeData must include previousResponseId, conversationId, or session.');\n}\n\nfunction createOpenAIResumeRunOptions<OUTPUT>(\n  resumeData: OpenAISDKAgentResumeData,\n  options?: SDKAgentRunOptions<OUTPUT>,\n): SDKAgentRunOptions<OUTPUT> {\n  return {\n    ...options,\n    previousResponseId: resumeData.previousResponseId ?? options?.previousResponseId,\n    conversationId: resumeData.conversationId ?? options?.conversationId,\n    session: resumeData.session ?? options?.session,\n  };\n}\n\nasync function runOpenAIGenerate<OUTPUT>(\n  prompt: string,\n  agent: OpenAIAgent,\n  runId: string,","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/agent-sdks/openai/src/index.ts#L239-L275","documentation":"The OpenAI SDK Agent wrapper requires resume data that points at an existing OpenAI conversation context. validateOpenAIResumeData checks that the passed resumeData object contains at least one of previousResponseId (string), conversationId (string), or session (defined). If none are present, resuming has nothing to continue from, so the library throws immediately instead of issuing a doomed API call.","triggerScenarios":"Calling a resume/streamResume method on OpenAISDKAgent with an empty object, an object with only unrelated fields (e.g. { threadId: '...' }), or fields set to null/undefined — i.e. resumeData where previousResponseId and conversationId are not strings and session is undefined.","commonSituations":"Persisting the agent result but forgetting to store previousResponseId; renaming or migrating fields in your own storage layer; passing a resume payload built for a different provider's agent (e.g. Claude thread IDs) into the OpenAI wrapper; TypeScript not catching it because resumeData was cast from a loosely-typed record or fetched from JSON.","solutions":["Capture the resume handle from the original run's result (previousResponseId, conversationId, or session) and store it alongside your application state.","Pass one of the three accepted fields in resumeData, e.g. { previousResponseId: 'resp_abc123' } — a stored session object also works.","Validate the persisted payload shape before deserializing/resuming; drop or re-create conversations with no stored handle.","If using run options instead, note that options-level previousResponseId/conversationId/session are only merged AFTER resumeData validates, so options alone do not bypass this check."],"exampleFix":"// before\nawait agent.resume({}) as unknown;\n// after\nawait agent.resume({ previousResponseId: result.responseId });","handlingStrategy":"validation","validationCode":"function canResume(d) {\n  return d != null &&\n    (typeof d.previousResponseId === 'string' ||\n     typeof d.conversationId === 'string' ||\n     d.session !== undefined);\n}\nif (!canResume(storedResumeData)) {\n  throw new Error('No stored resume context; start a new run instead.');\n}","typeGuard":"function isOpenAIResumeData(d: unknown): d is { previousResponseId: string } {\n  return typeof d === 'object' && d !== null &&\n    ('previousResponseId' in d || 'conversationId' in d || 'session' in d);\n}","tryCatchPattern":"try {\n  await agent.resume(resumeData);\n} catch (err) {\n  if (err instanceof Error && err.message.includes('resumeData must include')) {\n    result = await agent.generate(prompt); // fall back to fresh run\n  } else throw err;\n}","preventionTips":["Persist previousResponseId (or session) from every run result immediately, next to your conversation data.","Type the stored resume handle in your app code so TypeScript forces one of the three fields at creation time.","Validate stored payloads on load before attempting resume.","Treat missing handles as 'start new conversation' rather than an error path."],"tags":["validation","resume","openai","argument-error"],"backgroundTag":"missing-resume-context","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}