fix: yield error when initial stream response is not successful
This commit is contained in:
@@ -95,6 +95,14 @@ public class AnthropicApiClient : IAnthropicApiClient
|
|||||||
public async IAsyncEnumerable<AnthropicEvent> CreateMessageAsync(StreamMessageRequest request)
|
public async IAsyncEnumerable<AnthropicEvent> CreateMessageAsync(StreamMessageRequest request)
|
||||||
{
|
{
|
||||||
var response = await SendRequestAsync(request);
|
var response = await SendRequestAsync(request);
|
||||||
|
|
||||||
|
if (response.IsSuccessStatusCode is false)
|
||||||
|
{
|
||||||
|
var error = Deserialize<AnthropicError>(await response.Content.ReadAsStringAsync()) ?? new AnthropicError();
|
||||||
|
yield return new AnthropicEvent(EventType.Error, new ErrorEventData(error.Error));
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
var anthropicHeaders = new AnthropicHeaders(response.Headers);
|
var anthropicHeaders = new AnthropicHeaders(response.Headers);
|
||||||
|
|
||||||
using var responseContent = await response.Content.ReadAsStreamAsync();
|
using var responseContent = await response.Content.ReadAsStreamAsync();
|
||||||
|
|||||||
@@ -321,4 +321,42 @@ public class AnthropicApiClientTests : IntegrationTest
|
|||||||
toolCallResult.IsSuccess.Should().BeTrue();
|
toolCallResult.IsSuccess.Should().BeTrue();
|
||||||
toolCallResult.Value.Should().Be(getWeather("San Francisco, CA", "fahrenheit"));
|
toolCallResult.Value.Should().Be(getWeather("San Francisco, CA", "fahrenheit"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task CreateMessageAsync_WhenCalledMessageIsStreamAndRequestFails_ItShouldReturnErrorEvent()
|
||||||
|
{
|
||||||
|
_mockHttpMessageHandler
|
||||||
|
.WhenCreateStreamMessageRequest()
|
||||||
|
.Respond(
|
||||||
|
HttpStatusCode.BadRequest,
|
||||||
|
"application/json",
|
||||||
|
@"{
|
||||||
|
""type"": ""error"",
|
||||||
|
""error"": {
|
||||||
|
""type"": ""invalid_request_error"",
|
||||||
|
""message"": ""messages: roles must alternate between user and assistant, but found multiple user roles in a row""
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
);
|
||||||
|
|
||||||
|
var request = new StreamMessageRequest(
|
||||||
|
model: AnthropicModels.Claude35Sonnet,
|
||||||
|
messages: [
|
||||||
|
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||||
|
new(MessageRole.User, [new TextContent("Hello!")])
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
var result = Client.CreateMessageAsync(request);
|
||||||
|
var events = await result.ToListAsync();
|
||||||
|
|
||||||
|
events.Should().HaveCount(1);
|
||||||
|
events[0].Type.Should().Be(EventType.Error);
|
||||||
|
events[0].Data.Should().BeOfType<ErrorEventData>();
|
||||||
|
events[0].Data.Should().BeEquivalentTo(new ErrorEventData(
|
||||||
|
new InvalidRequestError(
|
||||||
|
"messages: roles must alternate between user and assistant, but found multiple user roles in a row"
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user