Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Anthropic.SDK.Tests/CacheControlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public async Task TestSingleToolAllowsCacheIndependentOfToolSize()
Stream = false,
Temperature = 1.0m,
System = systemMessages,
PromptCaching = PromptCacheType.Messages,
PromptCaching = PromptCacheType.AutomaticToolsAndSystem,
Tools = tools
};
var res = await client.Messages.GetClaudeMessageAsync(parameters);
Expand Down Expand Up @@ -223,7 +223,7 @@ public async Task TestCacheControlStreaming()
Stream = true,
Temperature = 1.0m,
System = systemMessages,
PromptCaching = PromptCacheType.Messages
PromptCaching = PromptCacheType.AutomaticToolsAndSystem
};
var messageResponses = new List<MessageResponse>();
await foreach (var message in client.Messages.StreamClaudeMessageAsync(parameters))
Expand Down
196 changes: 196 additions & 0 deletions Anthropic.SDK.Tests/DocumentTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,196 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Anthropic.SDK.Constants;
using Anthropic.SDK.Messaging;

namespace Anthropic.SDK.Tests
{
[TestClass]
public class DocumentTests
{
[TestMethod]
public async Task TestPDF()
{
string resourceName = "Anthropic.SDK.Tests.Claude3ModelCard.pdf";

Assembly assembly = Assembly.GetExecutingAssembly();

await using Stream stream = assembly.GetManifestResourceStream(resourceName);
//read stream into byte array
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
byte[] pdfBytes = ms.ToArray();
string base64String = Convert.ToBase64String(pdfBytes);


var client = new AnthropicClient();
var messages = new List<Message>()
{
new Message(RoleType.User, new DocumentContent()
{
Source = new DocumentSource()
{
Type = SourceType.base64,
Data = base64String,
MediaType = "application/pdf"
},
CacheControl = new CacheControl()
{
Type = CacheControlType.ephemeral
}
}),
new Message(RoleType.User, "Which model has the highest human preference win rates across each use-case?"),
};

var parameters = new MessageParameters()
{
Messages = messages,
MaxTokens = 1024,
Model = AnthropicModels.Claude35Sonnet,
Stream = false,
Temperature = 0m,
PromptCaching = PromptCacheType.FineGrained
};
var res = await client.Messages.GetClaudeMessageAsync(parameters);

Assert.IsNotNull(res.FirstMessage.ToString());
Assert.IsTrue(res.Usage.CacheCreationInputTokens > 0 || res.Usage.CacheReadInputTokens > 0);


}

[TestMethod]
public async Task TestPDFCitations()
{
var client = new AnthropicClient();
var messages = new List<Message>()
{
new Message(RoleType.User, new DocumentContent()
{
Source = new DocumentSource()
{
Type = SourceType.url,
Url = "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf"
},
CacheControl = new CacheControl()
{
Type = CacheControlType.ephemeral
},
Citations = new Citations() { Enabled = true }
}),
new Message(RoleType.User, "What are the key findings in this document? Use citations to back up your answer."),
};

var parameters = new MessageParameters()
{
Messages = messages,
MaxTokens = 1024,
Model = AnthropicModels.Claude35Sonnet,
Stream = false,
Temperature = 0m,
PromptCaching = PromptCacheType.FineGrained
};
var res = await client.Messages.GetClaudeMessageAsync(parameters);

Assert.IsTrue(res.Content.SelectMany(p => (p as TextContent).Citations ?? new List<CitationResult>()).Any());


}

[TestMethod]
public async Task TestPDFCitationsStreaming()
{
var client = new AnthropicClient();
var messages = new List<Message>()
{
new Message(RoleType.User, new DocumentContent()
{
Source = new DocumentSource()
{
Type = SourceType.url,
Url = "https://assets.anthropic.com/m/1cd9d098ac3e6467/original/Claude-3-Model-Card-October-Addendum.pdf"
},
CacheControl = new CacheControl()
{
Type = CacheControlType.ephemeral
},
Citations = new Citations() { Enabled = true }
}),
new Message(RoleType.User, "What are the key findings in this document? Use citations to back up your answer."),
};

var parameters = new MessageParameters()
{
Messages = messages,
MaxTokens = 1024,
Model = AnthropicModels.Claude35Sonnet,
Stream = false,
Temperature = 0m,
PromptCaching = PromptCacheType.FineGrained
};
var responses = new List<MessageResponse>();
await foreach (var result in client.Messages.StreamClaudeMessageAsync(parameters))
{
responses.Add(result);
}

var message = new Message(responses);
Assert.IsTrue(message.Content.SelectMany(p => (p as TextContent).Citations ?? new List<CitationResult>()).Any());

}

[TestMethod]
public async Task TestDocumentCitations()
{
string resourceName = "Anthropic.SDK.Tests.BillyBudd.txt";

Assembly assembly = Assembly.GetExecutingAssembly();

await using Stream stream = assembly.GetManifestResourceStream(resourceName);
using StreamReader reader = new StreamReader(stream);
string content = await reader.ReadToEndAsync();


var client = new AnthropicClient();
var messages = new List<Message>()
{
new Message(RoleType.User, new DocumentContent()
{
Source = new DocumentSource()
{
Type = SourceType.content,
Content = [new TextContent()
{
Text = content
}]
},
Citations = new Citations() { Enabled = true }
}),
new Message(RoleType.User, "Who is the protagonist in this text? Use citations to back up your answer."),
};

var parameters = new MessageParameters()
{
Messages = messages,
MaxTokens = 1024,
Model = AnthropicModels.Claude35Sonnet,
Stream = false,
Temperature = 0m
};
var res = await client.Messages.GetClaudeMessageAsync(parameters);

Assert.IsTrue(res.Content.SelectMany(p => (p as TextContent).Citations ?? new List<CitationResult>()).Any());


}


}


}
23 changes: 23 additions & 0 deletions Anthropic.SDK.Tests/ModelTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Anthropic.SDK.Tests
{
[TestClass]
public class ModelTests
{
[TestMethod]
public async Task TestModelEndpointFunctionality()
{
var client = new AnthropicClient();
var res = await client.Models.ListModelsAsync();
Assert.IsNotNull(res.Models);
var modelId = res.Models.First().Id;
var model = await client.Models.GetModelAsync(modelId);
Assert.IsNotNull(model);
}
}
}
66 changes: 0 additions & 66 deletions Anthropic.SDK.Tests/PDFTests.cs

This file was deleted.

52 changes: 52 additions & 0 deletions Anthropic.SDK.Tests/VisionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Anthropic.SDK.Constants;
using Anthropic.SDK.Messaging;

namespace Anthropic.SDK.Tests
{
[TestClass]
public class VisionTests
{
[TestMethod]
public async Task TestVisionUrl()
{
var client = new AnthropicClient();

var mp = new MessageParameters()
{
Model = AnthropicModels.Claude37Sonnet,
MaxTokens = 1024,
Messages = new List<Message>()
{
new Message()
{
Content = new List<ContentBase>()
{
new ImageContent()
{
Source = new ImageSource()
{
Type = SourceType.url,
Url =
"https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
}
},
new TextContent()
{
Text = "Describe this image."
}
}
}
}


};
var res = await client.Messages.GetClaudeMessageAsync(mp);
Assert.IsNotNull(res.FirstMessage.ToString());
}
}
}
8 changes: 4 additions & 4 deletions Anthropic.SDK/Anthropic.SDK.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
<PackageTags>Claude, AI, ML, API, Anthropic</PackageTags>
<Title>Claude API</Title>
<PackageReleaseNotes>
Updates Microsoft.Extensions.AI.Abstractions
Support for Citations, More Expansive Document Support, and Better Caching Support
</PackageReleaseNotes>
<PackageId>Anthropic.SDK</PackageId>
<Version>4.7.2</Version>
<AssemblyVersion>4.7.2.0</AssemblyVersion>
<FileVersion>4.7.2.0</FileVersion>
<Version>5.0.0</Version>
<AssemblyVersion>5.0.0.0</AssemblyVersion>
<FileVersion>5.0.0.0</FileVersion>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
<PackageReadmeFile>README.md</PackageReadmeFile>
<PackageIcon>icon.png</PackageIcon>
Expand Down
Loading