From 152acfef01b1d7f2780898643a2be264cb9ce9bb Mon Sep 17 00:00:00 2001 From: Andrey Nering Date: Thu, 12 Mar 2026 11:42:13 -0300 Subject: [PATCH] fix: guard against nil EncryptedContent dereference in reasoning details MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reasoning metadata can exist without encrypted content, causing a nil pointer panic when building prompt messages for openrouter and vercel. 💘 Generated with Crush Assisted-by: Claude Opus 4.6 via Crush --- providers/openrouter/language_model_hooks.go | 28 +++++++++++--------- providers/vercel/language_model_hooks.go | 14 +++++----- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/providers/openrouter/language_model_hooks.go b/providers/openrouter/language_model_hooks.go index fb69565ac57730cc7e323f4e9036849bc5cbd39a..5ae579d3ddb3fb226c62717f225b840807210b42 100644 --- a/providers/openrouter/language_model_hooks.go +++ b/providers/openrouter/language_model_hooks.go @@ -841,12 +841,14 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. Index: inx, }) } - reasoningDetails = append(reasoningDetails, ReasoningDetail{ - Type: "reasoning.encrypted", - Format: "openai-responses-v1", - Data: *metadata.EncryptedContent, - ID: metadata.ItemID, - }) + if metadata.EncryptedContent != nil { + reasoningDetails = append(reasoningDetails, ReasoningDetail{ + Type: "reasoning.encrypted", + Format: "openai-responses-v1", + Data: *metadata.EncryptedContent, + ID: metadata.ItemID, + }) + } data, _ := json.Marshal(reasoningDetails) reasoningDetailsMap := []map[string]any{} _ = json.Unmarshal(data, &reasoningDetailsMap) @@ -877,12 +879,14 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. Index: inx, }) } - reasoningDetails = append(reasoningDetails, ReasoningDetail{ - Type: "reasoning.encrypted", - Format: "xai-responses-v1", - Data: *metadata.EncryptedContent, - ID: metadata.ItemID, - }) + if metadata.EncryptedContent != nil { + reasoningDetails = append(reasoningDetails, ReasoningDetail{ + Type: "reasoning.encrypted", + Format: "xai-responses-v1", + Data: *metadata.EncryptedContent, + ID: metadata.ItemID, + }) + } data, _ := json.Marshal(reasoningDetails) reasoningDetailsMap := []map[string]any{} _ = json.Unmarshal(data, &reasoningDetailsMap) diff --git a/providers/vercel/language_model_hooks.go b/providers/vercel/language_model_hooks.go index d243e57f65d982b9d7739aeda1f1a6addbe4f868..ef3d5cf63bbbfef17123a31d496b5d3156499a83 100644 --- a/providers/vercel/language_model_hooks.go +++ b/providers/vercel/language_model_hooks.go @@ -874,12 +874,14 @@ func languageModelToPrompt(prompt fantasy.Prompt, _, model string) ([]openaisdk. Index: inx, }) } - reasoningDetails = append(reasoningDetails, ReasoningDetail{ - Type: "reasoning.encrypted", - Format: "openai-responses-v1", - Data: *metadata.EncryptedContent, - ID: metadata.ItemID, - }) + if metadata.EncryptedContent != nil { + reasoningDetails = append(reasoningDetails, ReasoningDetail{ + Type: "reasoning.encrypted", + Format: "openai-responses-v1", + Data: *metadata.EncryptedContent, + ID: metadata.ItemID, + }) + } data, _ := json.Marshal(reasoningDetails) reasoningDetailsMap := []map[string]any{} _ = json.Unmarshal(data, &reasoningDetailsMap)