fix(openai): reject tool messages with previous_response_id

Christian Rocha created

Change summary

providers/openai/responses_language_model.go |  5 ++++-
providers/openai/responses_params_test.go    | 15 +++++++++++----
2 files changed, 15 insertions(+), 5 deletions(-)

Detailed changes

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)
 		}
 	}

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 {