From 211520c2d20319d944d869e546bcfab7b7cabae2 Mon Sep 17 00:00:00 2001 From: John Brahy Date: Thu, 19 Mar 2026 02:22:28 -0700 Subject: [PATCH 1/2] updating .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eb93d640a..11d0ea16d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # ── GSD project state (development-only, lives in worktree branches) ── - +package-lock.json .claude/ RELEASE-GUIDE.md *.tgz From c47ee71b2d9ebf5d9d8c5ca6782ae11bc242441e Mon Sep 17 00:00:00 2001 From: John Brahy Date: Thu, 19 Mar 2026 02:53:06 -0700 Subject: [PATCH 2/2] fix: always include reasoning.encrypted_content for OpenAI reasoning models When using a reasoning model (o1, o3, o4-mini, etc.) without explicitly setting reasoningEffort or reasoningSummary, the include param was not set. OpenAI returns a bare rs_... reasoning item ID which gets stored in thinkingSignature and replayed in the next turn. Since store is false, OpenAI cannot find the rs_... item server-side and returns a 404. Fix: move params.include = ["reasoning.encrypted_content"] outside the reasoningEffort/reasoningSummary guard so it is always set for any reasoning model. This ensures the encrypted blob is returned and can be replayed correctly without needing server-side storage. --- packages/pi-ai/src/providers/openai-responses.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/pi-ai/src/providers/openai-responses.ts b/packages/pi-ai/src/providers/openai-responses.ts index bf8fa347a..09801c91f 100644 --- a/packages/pi-ai/src/providers/openai-responses.ts +++ b/packages/pi-ai/src/providers/openai-responses.ts @@ -236,13 +236,13 @@ function buildParams(model: Model<"openai-responses">, context: Context, options } if (model.reasoning) { + params.include = ["reasoning.encrypted_content"]; if (options?.reasoningEffort || options?.reasoningSummary) { const effort = clampReasoningForModel(model.name, options?.reasoningEffort || "medium") as typeof options.reasoningEffort; params.reasoning = { effort: effort || "medium", summary: options?.reasoningSummary || "auto", }; - params.include = ["reasoning.encrypted_content"]; } else { if (model.name.startsWith("gpt-5")) { // Jesus Christ, see https://community.openai.com/t/need-reasoning-false-option-for-gpt-5/1351588/7