tests: update tests to account for serialization and deserialization changes with new/modified model properties to support caching

This commit is contained in:
Stevan Freeborn
2024-08-16 09:21:43 -05:00
parent 66008717e1
commit 900a7a3549
10 changed files with 137 additions and 31 deletions
@@ -191,6 +191,8 @@ public class AnthropicApiClient : IAnthropicApiClient
{ {
InputTokens = existingUsage.InputTokens + msgDeltaData.Usage.InputTokens, InputTokens = existingUsage.InputTokens + msgDeltaData.Usage.InputTokens,
OutputTokens = existingUsage.OutputTokens + msgDeltaData.Usage.OutputTokens, OutputTokens = existingUsage.OutputTokens + msgDeltaData.Usage.OutputTokens,
CacheCreationInputTokens = existingUsage.CacheCreationInputTokens + msgDeltaData.Usage.CacheCreationInputTokens,
CacheReadInputTokens = existingUsage.CacheReadInputTokens + msgDeltaData.Usage.CacheReadInputTokens,
}; };
msgResponse = new MessageResponse() msgResponse = new MessageResponse()
@@ -17,7 +17,6 @@ static class JsonSerializationOptions
new EventDataConverter(), new EventDataConverter(),
new ContentDeltaConverter(), new ContentDeltaConverter(),
new JsonStringEnumConverter(), new JsonStringEnumConverter(),
new MessageRequestConverter(),
}, },
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
}; };
@@ -15,15 +15,40 @@ public abstract class BaseMessageRequest
public string Model { get; init; } = string.Empty; public string Model { get; init; } = string.Empty;
/// <summary> /// <summary>
/// Gets the system prompt to use for the request. /// Gets the system message that will be used as the system prompt if no system messages are provided.
/// </summary> /// </summary>
[JsonIgnore]
public string? System { get; init; } = null; public string? System { get; init; } = null;
/// <summary> /// <summary>
/// Gets the messages to send to the model. /// Gets the system messages to send to the model to be used as the system prompt.
/// </summary> /// </summary>
[JsonIgnore]
public List<TextContent>? SystemMessages { get; init; } = null; public List<TextContent>? SystemMessages { get; init; } = null;
/// <summary>
/// Gets the system prompt that will be used for the request.
/// If will return the system messages if they are provided, otherwise it will return the system message.
/// If neither are provided, it will return null.
/// </summary>
[JsonPropertyName("system")]
public List<TextContent>? SystemPrompt => GetSystemPrompt();
private List<TextContent>? GetSystemPrompt()
{
if (SystemMessages is not null)
{
return SystemMessages;
}
if (System is not null)
{
return [new TextContent(System)];
}
return null;
}
/// <summary> /// <summary>
/// Gets the messages to send to the model. /// Gets the messages to send to the model.
/// </summary> /// </summary>
@@ -13,7 +13,9 @@ public class AnthropicEventTests : SerializationTest
""stop_sequence"": """", ""stop_sequence"": """",
""usage"": { ""usage"": {
""input_tokens"": 472, ""input_tokens"": 472,
""output_tokens"": 2 ""output_tokens"": 2,
""cache_creation_input_tokens"": 0,
""cache_read_input_tokens"": 0
}, },
""content"": [], ""content"": [],
""stop_reason"": """" ""stop_reason"": """"
@@ -70,7 +72,9 @@ public class AnthropicEventTests : SerializationTest
}, },
""usage"": { ""usage"": {
""output_tokens"": 89, ""output_tokens"": 89,
""input_tokens"": 0 ""input_tokens"": 0,
""cache_creation_input_tokens"": 0,
""cache_read_input_tokens"": 0
}, },
""type"": ""message_delta"" ""type"": ""message_delta""
} }
@@ -10,7 +10,9 @@ public class MessageDeltaEventDataTests : SerializationTest
}, },
""usage"": { ""usage"": {
""input_tokens"": 1, ""input_tokens"": 1,
""output_tokens"": 1 ""output_tokens"": 1,
""cache_creation_input_tokens"": 1,
""cache_read_input_tokens"": 1
} }
}"; }";
@@ -18,7 +20,13 @@ public class MessageDeltaEventDataTests : SerializationTest
public void Constructor_WhenCalled_ItShouldInitializeProperties() public void Constructor_WhenCalled_ItShouldInitializeProperties()
{ {
var expectedDelta = new MessageDelta("max_tokens", "max_tokens"); var expectedDelta = new MessageDelta("max_tokens", "max_tokens");
var expectedUsage = new Usage { InputTokens = 1, OutputTokens = 1 }; var expectedUsage = new Usage
{
InputTokens = 1,
OutputTokens = 1,
CacheCreationInputTokens = 1,
CacheReadInputTokens = 1,
};
var messageDeltaEventData = new MessageDeltaEventData(expectedDelta, expectedUsage); var messageDeltaEventData = new MessageDeltaEventData(expectedDelta, expectedUsage);
@@ -30,7 +38,13 @@ public class MessageDeltaEventDataTests : SerializationTest
public void JsonSerialization_WhenSerialized_ItShouldHaveExpectedShape() public void JsonSerialization_WhenSerialized_ItShouldHaveExpectedShape()
{ {
var expectedDelta = new MessageDelta("max_tokens", "max_tokens"); var expectedDelta = new MessageDelta("max_tokens", "max_tokens");
var expectedUsage = new Usage { InputTokens = 1, OutputTokens = 1 }; var expectedUsage = new Usage
{
InputTokens = 1,
OutputTokens = 1,
CacheCreationInputTokens = 1,
CacheReadInputTokens = 1,
};
var messageDeltaEventData = new MessageDeltaEventData(expectedDelta, expectedUsage); var messageDeltaEventData = new MessageDeltaEventData(expectedDelta, expectedUsage);
@@ -43,7 +57,13 @@ public class MessageDeltaEventDataTests : SerializationTest
public void JsonDeserialization_WhenDeserialized_ItShouldHaveExpectedValues() public void JsonDeserialization_WhenDeserialized_ItShouldHaveExpectedValues()
{ {
var expectedDelta = new MessageDelta("max_tokens", "max_tokens"); var expectedDelta = new MessageDelta("max_tokens", "max_tokens");
var expectedUsage = new Usage { InputTokens = 1, OutputTokens = 1 }; var expectedUsage = new Usage
{
InputTokens = 1,
OutputTokens = 1,
CacheCreationInputTokens = 1,
CacheReadInputTokens = 1,
};
var messageDeltaEventData = Deserialize<MessageDeltaEventData>(_testJson); var messageDeltaEventData = Deserialize<MessageDeltaEventData>(_testJson);
@@ -4,7 +4,10 @@ public class MessageRequestTests : SerializationTest
{ {
private readonly string _testJson = @"{ private readonly string _testJson = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [ ""messages"": [
{ ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] } { ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] }
], ],
@@ -21,7 +24,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithAnyToolChoice = @"{ private readonly string _testJsonWithAnyToolChoice = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"":[ ""messages"":[
{ ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"":""text"" }] } { ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"":""text"" }] }
], ],
@@ -38,7 +44,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithSpecificToolChoice = @"{ private readonly string _testJsonWithSpecificToolChoice = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [ ""messages"": [
{ ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] } { ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] }
], ],
@@ -55,7 +64,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithImageContent = @"{ private readonly string _testJsonWithImageContent = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"":[ ""messages"":[
{ {
""role"": ""user"", ""role"": ""user"",
@@ -80,7 +92,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithUnknownContent = @"{ private readonly string _testJsonWithUnknownContent = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [{ ""role"": ""user"", ""content"": [{ ""type"": ""unknown"", ""text"": ""text"" }] }], ""messages"": [{ ""role"": ""user"", ""content"": [{ ""type"": ""unknown"", ""text"": ""text"" }] }],
""max_tokens"": 512, ""max_tokens"": 512,
""metadata"": { ""test"": ""test"" }, ""metadata"": { ""test"": ""test"" },
@@ -95,7 +110,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithToolUseContent = @"{ private readonly string _testJsonWithToolUseContent = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [ ""messages"": [
{ {
""role"": ""assistant"", ""role"": ""assistant"",
@@ -124,7 +142,10 @@ public class MessageRequestTests : SerializationTest
private readonly string _testJsonWithToolResultContent = @"{ private readonly string _testJsonWithToolResultContent = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [ ""messages"": [
{ {
""role"": ""assistant"", ""role"": ""assistant"",
@@ -307,7 +328,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJson); var messageRequest = Deserialize<MessageRequest>(_testJson);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -330,7 +351,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJsonWithAnyToolChoice); var messageRequest = Deserialize<MessageRequest>(_testJsonWithAnyToolChoice);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -352,7 +373,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJsonWithSpecificToolChoice); var messageRequest = Deserialize<MessageRequest>(_testJsonWithSpecificToolChoice);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -387,7 +408,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJsonWithImageContent); var messageRequest = Deserialize<MessageRequest>(_testJsonWithImageContent);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -416,7 +437,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJsonWithToolUseContent); var messageRequest = Deserialize<MessageRequest>(_testJsonWithToolUseContent);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -447,7 +468,7 @@ public class MessageRequestTests : SerializationTest
var messageRequest = Deserialize<MessageRequest>(_testJsonWithToolResultContent); var messageRequest = Deserialize<MessageRequest>(_testJsonWithToolResultContent);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -53,7 +53,12 @@ public class MessageResponseTests : SerializationTest
""stop_reason"": ""stop reason"", ""stop_reason"": ""stop reason"",
""stop_sequence"": ""stop sequence"", ""stop_sequence"": ""stop sequence"",
""type"": ""type"", ""type"": ""type"",
""usage"": { ""input_tokens"": 1, ""output_tokens"": 2 }, ""usage"": {
""input_tokens"": 1,
""output_tokens"": 2,
""cache_creation_input_tokens"": 0,
""cache_read_input_tokens"": 0
},
""content"": [ ""content"": [
{ ""text"": ""text content"", ""type"": ""text"" } { ""text"": ""text content"", ""type"": ""text"" }
] ]
@@ -93,7 +98,12 @@ public class MessageResponseTests : SerializationTest
""stop_reason"": ""stop reason"", ""stop_reason"": ""stop reason"",
""stop_sequence"": ""stop sequence"", ""stop_sequence"": ""stop sequence"",
""type"": ""type"", ""type"": ""type"",
""usage"": { ""input_tokens"": 1, ""output_tokens"": 2 }, ""usage"": {
""input_tokens"": 1,
""output_tokens"": 2,
""cache_creation_input_tokens"": 0,
""cache_read_input_tokens"": 0
},
""content"": [ ""content"": [
{ ""text"": ""text content"", ""type"": ""text"" } { ""text"": ""text content"", ""type"": ""text"" }
] ]
@@ -14,7 +14,9 @@ public class MessageStartEventDataTests : SerializationTest
""stop_sequence"": """", ""stop_sequence"": """",
""usage"": { ""usage"": {
""input_tokens"": 25, ""input_tokens"": 25,
""output_tokens"": 1 ""output_tokens"": 1,
""cache_creation_input_tokens"": 0,
""cache_read_input_tokens"": 0
} }
} }
}"; }";
@@ -4,7 +4,10 @@ public class StreamMessageRequestTests : SerializationTest
{ {
private readonly string _testJson = @"{ private readonly string _testJson = @"{
""model"": ""claude-3-sonnet-20240229"", ""model"": ""claude-3-sonnet-20240229"",
""system"": ""test-system"", ""system"": [{
""type"": ""text"",
""text"": ""test-system""
}],
""messages"": [ ""messages"": [
{ ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] } { ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] }
], ],
@@ -178,7 +181,7 @@ public class StreamMessageRequestTests : SerializationTest
var messageRequest = Deserialize<StreamMessageRequest>(_testJson); var messageRequest = Deserialize<StreamMessageRequest>(_testJson);
messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet); messageRequest!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
messageRequest.System.Should().Be("test-system"); messageRequest.System.Should().BeNull();
messageRequest.Messages.Should().HaveCount(1); messageRequest.Messages.Should().HaveCount(1);
messageRequest.MaxTokens.Should().Be(512); messageRequest.MaxTokens.Should().Be(512);
messageRequest.Metadata.Should().HaveCount(1); messageRequest.Metadata.Should().HaveCount(1);
@@ -7,26 +7,39 @@ public class UsageTests : SerializationTest
{ {
var expectedInputTokens = 1; var expectedInputTokens = 1;
var expectedOutputTokens = 2; var expectedOutputTokens = 2;
var expectedCacheCreationInputTokens = 3;
var expectedCacheReadInputTokens = 4;
var usage = new Usage var usage = new Usage
{ {
InputTokens = expectedInputTokens, InputTokens = expectedInputTokens,
OutputTokens = expectedOutputTokens OutputTokens = expectedOutputTokens,
CacheCreationInputTokens = expectedCacheCreationInputTokens,
CacheReadInputTokens = expectedCacheReadInputTokens
}; };
usage.InputTokens.Should().Be(expectedInputTokens); usage.InputTokens.Should().Be(expectedInputTokens);
usage.OutputTokens.Should().Be(expectedOutputTokens); usage.OutputTokens.Should().Be(expectedOutputTokens);
usage.CacheCreationInputTokens.Should().Be(expectedCacheCreationInputTokens);
usage.CacheReadInputTokens.Should().Be(expectedCacheReadInputTokens);
} }
[Fact] [Fact]
public void JsonSerialization_WhenCalled_ItShouldSerializeCorrectly() public void JsonSerialization_WhenCalled_ItShouldSerializeCorrectly()
{ {
var expectedJson = @"{ ""input_tokens"": 1, ""output_tokens"": 2 }"; var expectedJson = @"{
""input_tokens"": 1,
""output_tokens"": 2,
""cache_creation_input_tokens"": 3,
""cache_read_input_tokens"": 4
}";
var usage = new Usage var usage = new Usage
{ {
InputTokens = 1, InputTokens = 1,
OutputTokens = 2 OutputTokens = 2,
CacheCreationInputTokens = 3,
CacheReadInputTokens = 4
}; };
var actual = Serialize(usage); var actual = Serialize(usage);
@@ -37,11 +50,18 @@ public class UsageTests : SerializationTest
[Fact] [Fact]
public void JsonDeserialization_WhenCalled_ItShouldDeserializeCorrectly() public void JsonDeserialization_WhenCalled_ItShouldDeserializeCorrectly()
{ {
var json = @"{ ""input_tokens"": 1, ""output_tokens"": 2 }"; var json = @"{
""input_tokens"": 1,
""output_tokens"": 2,
""cache_creation_input_tokens"": 3,
""cache_read_input_tokens"": 4
}";
var usage = Deserialize<Usage>(json); var usage = Deserialize<Usage>(json);
usage!.InputTokens.Should().Be(1); usage!.InputTokens.Should().Be(1);
usage.OutputTokens.Should().Be(2); usage.OutputTokens.Should().Be(2);
usage.CacheCreationInputTokens.Should().Be(3);
usage.CacheReadInputTokens.Should().Be(4);
} }
} }