feat: add support for count tokens endpoint
This commit is contained in:
@@ -299,4 +299,21 @@ public class ClientTests(ConfigurationFixture configFixture) : EndToEndTest(conf
|
||||
resultTwo.Value.Content.Should().NotBeNullOrEmpty();
|
||||
resultTwo.Value.Usage.CacheReadInputTokens.Should().BeGreaterThan(0);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CountMessageTokensAsync_WhenCalled_ItShouldReturnResponse()
|
||||
{
|
||||
var request = new CountMessageTokensRequest(
|
||||
model: AnthropicModels.Claude3Haiku,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")])
|
||||
]
|
||||
);
|
||||
|
||||
var result = await _client.CountMessageTokensAsync(request);
|
||||
|
||||
result.IsSuccess.Should().BeTrue();
|
||||
result.Value.Should().BeOfType<TokenCountResponse>();
|
||||
result.Value.InputTokens.Should().BeGreaterThan(0);
|
||||
}
|
||||
}
|
||||
@@ -131,22 +131,4 @@ public class AnthropicModelsTests
|
||||
|
||||
actual.Should().Be(expected);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("claude-3-opus-20240229", true)]
|
||||
[InlineData("claude-3-opus-latest", true)]
|
||||
[InlineData("claude-3-sonnet-20240229", true)]
|
||||
[InlineData("claude-3-5-sonnet-20240620", true)]
|
||||
[InlineData("claude-3-5-sonnet-20241022", true)]
|
||||
[InlineData("claude-3-5-sonnet-latest", true)]
|
||||
[InlineData("claude-3-haiku-20240307", true)]
|
||||
[InlineData("claude-3-5-haiku-20241022", true)]
|
||||
[InlineData("claude-3-5-haiku-latest", true)]
|
||||
[InlineData("invalid", false)]
|
||||
public void IsValidModel_WhenCalled_ItShouldReturnExpectedValue(string modelId, bool expected)
|
||||
{
|
||||
var actual = AnthropicModels.IsValidModel(modelId);
|
||||
|
||||
actual.Should().Be(expected);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
namespace AnthropicClient.Tests.Unit.Models;
|
||||
|
||||
public class CountMessageTokensRequestTests : SerializationTest
|
||||
{
|
||||
private readonly string _testJson = @"{
|
||||
""model"": ""claude-3-sonnet-20240229"",
|
||||
""system"": [{
|
||||
""type"": ""text"",
|
||||
""text"": ""test-system""
|
||||
}],
|
||||
""messages"": [
|
||||
{ ""role"": ""user"", ""content"": [{ ""text"": ""Hello!"", ""type"": ""text"" }] }
|
||||
],
|
||||
""tool_choice"": { ""type"":""auto"" },
|
||||
""tools"": []
|
||||
}";
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalled_ItShouldInitializeProperties()
|
||||
{
|
||||
var model = AnthropicModels.Claude3Sonnet;
|
||||
var messages = new List<Message> { new() };
|
||||
var systemPrompt = new List<TextContent>() { new("test-system") };
|
||||
var toolChoice = new AutoToolChoice();
|
||||
var tools = new List<Tool>();
|
||||
|
||||
var request = new CountMessageTokensRequest(
|
||||
model: model,
|
||||
messages: messages,
|
||||
toolChoice: toolChoice,
|
||||
tools: tools,
|
||||
systemPrompt: systemPrompt
|
||||
);
|
||||
|
||||
request.Model.Should().Be(model);
|
||||
request.Messages.Should().BeSameAs(messages);
|
||||
request.ToolChoice.Should().Be(toolChoice);
|
||||
request.Tools.Should().BeSameAs(tools);
|
||||
request.SystemPrompt.Should().BeSameAs(systemPrompt);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalledAndModelIsNull_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var action = () => new CountMessageTokensRequest(
|
||||
model: null!,
|
||||
messages: [new()]
|
||||
);
|
||||
|
||||
action.Should().Throw<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalledAndMessagesIsNull_ItShouldThrowArgumentNullException()
|
||||
{
|
||||
var action = () => new CountMessageTokensRequest(
|
||||
model: AnthropicModels.Claude3Sonnet,
|
||||
messages: null!
|
||||
);
|
||||
|
||||
action.Should().Throw<ArgumentNullException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Constructor_WhenCalledAndMessagesIsEmpty_ItShouldThrowArgumentException()
|
||||
{
|
||||
var action = () => new CountMessageTokensRequest(
|
||||
model: AnthropicModels.Claude3Sonnet,
|
||||
messages: []
|
||||
);
|
||||
|
||||
action.Should().Throw<ArgumentException>();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void JsonSerialization_WhenSerialized_ItShouldHaveExpectedShape()
|
||||
{
|
||||
var messages = new List<Message>()
|
||||
{
|
||||
new()
|
||||
{
|
||||
Role = MessageRole.User,
|
||||
Content = [new TextContent("Hello!")]
|
||||
}
|
||||
};
|
||||
|
||||
var model = AnthropicModels.Claude3Sonnet;
|
||||
var systemPrompt = new List<TextContent>() { new("test-system") };
|
||||
var toolChoice = new AutoToolChoice();
|
||||
var tools = new List<Tool>();
|
||||
|
||||
var request = new CountMessageTokensRequest(
|
||||
model: model,
|
||||
messages: messages,
|
||||
toolChoice: toolChoice,
|
||||
tools: tools,
|
||||
systemPrompt: systemPrompt
|
||||
);
|
||||
|
||||
var actual = Serialize(request);
|
||||
|
||||
JsonAssert.Equal(_testJson, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void JsonDeserialization_WhenDeserialized_ItShouldHaveExpectedShape()
|
||||
{
|
||||
var request = Deserialize<CountMessageTokensRequest>(_testJson);
|
||||
|
||||
request!.Model.Should().Be(AnthropicModels.Claude3Sonnet);
|
||||
request.SystemPrompt.Should().BeEquivalentTo(new List<TextContent> { new("test-system") });
|
||||
request.Messages.Should().HaveCount(1);
|
||||
request.ToolChoice.Should().BeOfType<AutoToolChoice>();
|
||||
request.ToolChoice!.Type.Should().Be("auto");
|
||||
request.Tools.Should().HaveCount(0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
namespace AnthropicClient.Tests.Unit.Models;
|
||||
|
||||
public class TokenCountResponseTests : SerializationTest
|
||||
{
|
||||
[Fact]
|
||||
public void Constructor_WhenCalled_ShouldInitializeProperties()
|
||||
{
|
||||
var expectedTokenCount = 1;
|
||||
|
||||
var response = new TokenCountResponse
|
||||
{
|
||||
InputTokens = expectedTokenCount
|
||||
};
|
||||
|
||||
response.InputTokens.Should().Be(expectedTokenCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void JsonSerialization_WhenCalled_ItShouldSerializeCorrectly()
|
||||
{
|
||||
var expectedJson = @"{
|
||||
""input_tokens"": 1
|
||||
}";
|
||||
|
||||
var response = new TokenCountResponse
|
||||
{
|
||||
InputTokens = 1
|
||||
};
|
||||
|
||||
var actual = Serialize(response);
|
||||
|
||||
JsonAssert.Equal(expectedJson, actual);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void JsonDeserialization_WhenCalled_ItShouldDeserializeCorrectly()
|
||||
{
|
||||
var json = @"{
|
||||
""input_tokens"": 1
|
||||
}";
|
||||
|
||||
var response = Deserialize<TokenCountResponse>(json);
|
||||
|
||||
response!.InputTokens.Should().Be(1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user