From 9f8476eb05637892aa914981bee10457e57a3170 Mon Sep 17 00:00:00 2001 From: Christian Rocha Date: Tue, 17 Mar 2026 20:33:18 -0400 Subject: [PATCH] fix(openai): reject tool messages with previous_response_id --- providers/openai/responses_language_model.go | 5 ++++- providers/openai/responses_params_test.go | 15 +++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/providers/openai/responses_language_model.go b/providers/openai/responses_language_model.go index f65ef87244b814664ae1b42ce6c6d0d6c42e86dc..aa48497945d6913d463bdfa49ed095e9f9cb8111 100644 --- a/providers/openai/responses_language_model.go +++ b/providers/openai/responses_language_model.go @@ -346,7 +346,10 @@ func (o responsesLanguageModel) prepareParams(call fantasy.Call) (*responses.Res func validatePreviousResponseIDPrompt(prompt fantasy.Prompt) error { for _, msg := range prompt { - if msg.Role == fantasy.MessageRoleAssistant { + switch msg.Role { + case fantasy.MessageRoleSystem, fantasy.MessageRoleUser: + continue + default: return errors.New(previousResponseIDHistoryError) } } diff --git a/providers/openai/responses_params_test.go b/providers/openai/responses_params_test.go index 7703a074b4140b923571a805d329ecc879fa9e9a..0cefc1b182e6969ff97f3e29ddb62380be68ce96 100644 --- a/providers/openai/responses_params_test.go +++ b/providers/openai/responses_params_test.go @@ -132,15 +132,14 @@ func TestPrepareParams_PreviousResponseID_Validation(t *testing.T) { require.Empty(t, warnings) }) - t.Run("allows tool messages without assistant history", func(t *testing.T) { + t.Run("rejects tool messages", func(t *testing.T) { t.Parallel() - _, warnings, err := lm.prepareParams(testCall(fantasy.Prompt{ + _, _, err := lm.prepareParams(testCall(fantasy.Prompt{ testToolResultMessage("done"), testTextMessage(fantasy.MessageRoleUser, "hello"), }, opts)) - require.NoError(t, err) - require.Empty(t, warnings) + require.EqualError(t, err, previousResponseIDHistoryError) }) } @@ -186,6 +185,14 @@ func TestValidatePreviousResponseIDPrompt(t *testing.T) { }, wantErr: true, }, + { + name: "contains tool message", + prompt: fantasy.Prompt{ + testToolResultMessage("done"), + testTextMessage(fantasy.MessageRoleUser, "follow up"), + }, + wantErr: true, + }, } for _, tt := range tests {