docs: work on README
This commit is contained in:
@@ -4,7 +4,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
{
|
||||
[Theory]
|
||||
[ClassData(typeof(ErrorTestData))]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndErrorReturned_ItShouldHandleError(
|
||||
public async Task CreateMessageAsync_WhenCalledAndErrorReturned_ItShouldHandleError(
|
||||
HttpStatusCode statusCode,
|
||||
string content,
|
||||
Type errorType
|
||||
@@ -18,12 +18,12 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
content
|
||||
);
|
||||
|
||||
var request = new ChatMessageRequest(
|
||||
var request = new MessageRequest(
|
||||
model: AnthropicModels.Claude3Haiku,
|
||||
messages: [new(MessageRole.User, [new TextContent("Hello!")])]
|
||||
);
|
||||
|
||||
var result = await Client.CreateChatMessageAsync(request);
|
||||
var result = await Client.CreateMessageAsync(request);
|
||||
|
||||
result.IsSuccess.Should().BeFalse();
|
||||
result.Error.Should().BeOfType<AnthropicError>();
|
||||
@@ -33,7 +33,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndMessageCreatedWithTextContent_ItShouldReturnMessage()
|
||||
public async Task CreateMessageAsync_WhenCalledAndMessageCreatedWithTextContent_ItShouldReturnMessage()
|
||||
{
|
||||
_mockHttpMessageHandler
|
||||
.WhenCreateMessageRequest()
|
||||
@@ -60,15 +60,15 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
}"
|
||||
);
|
||||
|
||||
var request = new ChatMessageRequest(
|
||||
var request = new MessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [new(MessageRole.User, [new TextContent("Hello!")])]
|
||||
);
|
||||
|
||||
var result = await Client.CreateChatMessageAsync(request);
|
||||
var result = await Client.CreateMessageAsync(request);
|
||||
|
||||
result.IsSuccess.Should().BeTrue();
|
||||
result.Value.Should().BeOfType<ChatResponse>();
|
||||
result.Value.Should().BeOfType<MessageResponse>();
|
||||
result.Error.Should().BeNull();
|
||||
|
||||
var message = result.Value;
|
||||
@@ -90,7 +90,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndMessageCreatedWithToolUseContentAndToolIsProvided_ItShouldReturnMessageWithToolCall()
|
||||
public async Task CreateMessageAsync_WhenCalledAndMessageCreatedWithToolUseContentAndToolIsProvided_ItShouldReturnMessageWithToolCall()
|
||||
{
|
||||
_mockHttpMessageHandler
|
||||
.WhenCreateMessageRequest()
|
||||
@@ -121,7 +121,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
|
||||
var func = (string ticker) => ticker;
|
||||
|
||||
var request = new ChatMessageRequest(
|
||||
var request = new MessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||
@@ -131,10 +131,10 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
]
|
||||
);
|
||||
|
||||
var result = await Client.CreateChatMessageAsync(request);
|
||||
var result = await Client.CreateMessageAsync(request);
|
||||
|
||||
result.IsSuccess.Should().BeTrue();
|
||||
result.Value.Should().BeOfType<ChatResponse>();
|
||||
result.Value.Should().BeOfType<MessageResponse>();
|
||||
result.Error.Should().BeNull();
|
||||
|
||||
var message = result.Value;
|
||||
@@ -168,7 +168,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
|
||||
|
||||
[Fact]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndMessageCreatedWithToolUseButNoToolProvided_ItShouldReturnMessageWithoutToolCall()
|
||||
public async Task CreateMessageAsync_WhenCalledAndMessageCreatedWithToolUseButNoToolProvided_ItShouldReturnMessageWithoutToolCall()
|
||||
{
|
||||
_mockHttpMessageHandler
|
||||
.WhenCreateMessageRequest()
|
||||
@@ -197,17 +197,17 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
}"
|
||||
);
|
||||
|
||||
var request = new ChatMessageRequest(
|
||||
var request = new MessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||
]
|
||||
);
|
||||
|
||||
var result = await Client.CreateChatMessageAsync(request);
|
||||
var result = await Client.CreateMessageAsync(request);
|
||||
|
||||
result.IsSuccess.Should().BeTrue();
|
||||
result.Value.Should().BeOfType<ChatResponse>();
|
||||
result.Value.Should().BeOfType<MessageResponse>();
|
||||
result.Error.Should().BeNull();
|
||||
|
||||
var message = result.Value;
|
||||
@@ -236,7 +236,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
|
||||
[Theory]
|
||||
[ClassData(typeof(EventTestData))]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndMessageIsStreamed_ItShouldHandleAllEventTypes(string eventString, AnthropicEvent anthropicEvent)
|
||||
public async Task CreateMessageAsync_WhenCalledAndMessageIsStreamed_ItShouldHandleAllEventTypes(string eventString, AnthropicEvent anthropicEvent)
|
||||
{
|
||||
_mockHttpMessageHandler
|
||||
.WhenCreateStreamMessageRequest()
|
||||
@@ -246,21 +246,21 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
new MemoryStream(Encoding.UTF8.GetBytes(eventString))
|
||||
);
|
||||
|
||||
var request = new StreamChatMessageRequest(
|
||||
var request = new StreamMessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||
]
|
||||
);
|
||||
|
||||
var result = Client.CreateChatMessageAsync(request);
|
||||
var result = Client.CreateMessageAsync(request);
|
||||
var e = await result.FirstOrDefaultAsync();
|
||||
|
||||
e.Should().BeEquivalentTo(anthropicEvent);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateChatMessageAsync_WhenCalledAndMessageIsStreamed_ItShouldReturnAllExpectedEvents()
|
||||
public async Task CreateMessageAsync_WhenCalledAndMessageIsStreamed_ItShouldReturnAllExpectedEvents()
|
||||
{
|
||||
var eventStream = EventTestData.GetEventStream();
|
||||
var events = EventTestData.GetAllEvents();
|
||||
@@ -273,14 +273,14 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
eventStream
|
||||
);
|
||||
|
||||
var request = new StreamChatMessageRequest(
|
||||
var request = new StreamMessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||
]
|
||||
);
|
||||
|
||||
var result = Client.CreateChatMessageAsync(request);
|
||||
var result = Client.CreateMessageAsync(request);
|
||||
|
||||
var actualEvents = await result.ToListAsync();
|
||||
|
||||
@@ -288,7 +288,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CreateChatMessageAsync_WhenCalledMessageIsStreamedAndToolProvide_ItShouldReturnToolCall()
|
||||
public async Task CreateMessageAsync_WhenCalledMessageIsStreamedAndToolProvide_ItShouldReturnToolCall()
|
||||
{
|
||||
var eventStream = EventTestData.GetEventStream();
|
||||
|
||||
@@ -302,7 +302,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
|
||||
var getWeather = (string location, string unit) => $"The weather in {location} is 72°{unit}";
|
||||
|
||||
var request = new StreamChatMessageRequest(
|
||||
var request = new StreamMessageRequest(
|
||||
model: AnthropicModels.Claude35Sonnet,
|
||||
messages: [
|
||||
new(MessageRole.User, [new TextContent("Hello!")]),
|
||||
@@ -312,7 +312,7 @@ public class AnthropicApiClientTests : IntegrationTest
|
||||
]
|
||||
);
|
||||
|
||||
var result = Client.CreateChatMessageAsync(request);
|
||||
var result = Client.CreateMessageAsync(request);
|
||||
var msgCompleteEvent = await result
|
||||
.Where(e => e.Type is EventType.MessageComplete)
|
||||
.FirstAsync();
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
namespace AnthropicClient.Tests.Integration;
|
||||
|
||||
public class ErrorTestData : IEnumerable<object[]>
|
||||
{
|
||||
public IEnumerator<object[]> GetEnumerator()
|
||||
{
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.BadRequest,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""invalid_request_error"",
|
||||
""message"": ""Invalid request.""
|
||||
}
|
||||
}",
|
||||
typeof(InvalidRequestError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.Unauthorized,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""authentication_error"",
|
||||
""message"": ""Authentication error.""
|
||||
}
|
||||
}",
|
||||
typeof(AuthenticationError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.Forbidden,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""permission_error"",
|
||||
""message"": ""Permission error.""
|
||||
}
|
||||
}",
|
||||
typeof(PermissionError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.NotFound,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""not_found_error"",
|
||||
""message"": ""Not found error.""
|
||||
}
|
||||
}",
|
||||
typeof(NotFoundError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.TooManyRequests,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""rate_limit_error"",
|
||||
""message"": ""Rate limit error.""
|
||||
}
|
||||
}",
|
||||
typeof(RateLimitError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
HttpStatusCode.InternalServerError,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""api_error"",
|
||||
""message"": ""Internal server error.""
|
||||
}
|
||||
}",
|
||||
typeof(ApiError)
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
(HttpStatusCode)529,
|
||||
@"{
|
||||
""type"": ""error"",
|
||||
""error"": {
|
||||
""type"": ""overloaded_error"",
|
||||
""message"": ""Overloaded error.""
|
||||
}
|
||||
}",
|
||||
typeof(OverloadedError)
|
||||
};
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||
}
|
||||
@@ -1,666 +0,0 @@
|
||||
namespace AnthropicClient.Tests.Integration;
|
||||
|
||||
public class EventTestData : IEnumerable<object[]>
|
||||
{
|
||||
public static MemoryStream GetEventStream()
|
||||
{
|
||||
var events = new EventTestData().Select(x => x[0].ToString())!;
|
||||
var content = string.Join("\n\n", events);
|
||||
return new MemoryStream(Encoding.UTF8.GetBytes(content));
|
||||
}
|
||||
public static List<AnthropicEvent> GetAllEvents() => new EventTestData().Select(x => x[1] as AnthropicEvent).Append(MessageCompleteEvent).ToList()!;
|
||||
|
||||
public static readonly AnthropicEvent MessageCompleteEvent = new()
|
||||
{
|
||||
Type = EventType.MessageComplete,
|
||||
Data = new MessageCompleteEventData(
|
||||
new()
|
||||
{
|
||||
Id = "msg_014p7gG3wDgGV9EUtLvnow3U",
|
||||
Type = "message",
|
||||
Role = MessageRole.Assistant,
|
||||
Model = AnthropicModels.Claude3Haiku,
|
||||
StopSequence = null,
|
||||
Usage = new ChatUsage { InputTokens = 472, OutputTokens = 91 },
|
||||
StopReason = "tool_use",
|
||||
Content = [
|
||||
new TextContent("Okay, let's check the weather for San Francisco, CA:"),
|
||||
new ToolUseContent()
|
||||
{
|
||||
Id = "toolu_01T1x1fJ34qAmk2tNTrN7Up6",
|
||||
Name = "get_weather",
|
||||
Input = new Dictionary<string, object?>
|
||||
{
|
||||
{ "location", "San Francisco, CA" },
|
||||
{ "unit", "fahrenheit" }
|
||||
},
|
||||
},
|
||||
]
|
||||
},
|
||||
new()
|
||||
)
|
||||
};
|
||||
|
||||
public IEnumerator<object[]> GetEnumerator()
|
||||
{
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: message_start
|
||||
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-3-haiku-20240307","stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2},"content":[],"stop_reason":null}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.MessageStart,
|
||||
Data = new MessageStartEventData()
|
||||
{
|
||||
Message = new ChatResponse()
|
||||
{
|
||||
Id = "msg_014p7gG3wDgGV9EUtLvnow3U",
|
||||
Type = "message",
|
||||
Role = "assistant",
|
||||
Model = "claude-3-haiku-20240307",
|
||||
StopSequence = null,
|
||||
Usage = new ChatUsage()
|
||||
{
|
||||
InputTokens = 472,
|
||||
OutputTokens = 2,
|
||||
},
|
||||
Content = [],
|
||||
StopReason = null,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_start
|
||||
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockStart,
|
||||
Data = new ContentStartEventData()
|
||||
{
|
||||
Index = 0,
|
||||
ContentBlock = new TextContent()
|
||||
{
|
||||
Type = "text",
|
||||
Text = "",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: ping
|
||||
data: {"type": "ping"}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.Ping,
|
||||
Data = new PingEventData(),
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Okay"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = "Okay",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = ",",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" let"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " let",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"'s"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = "'s",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" check"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " check",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " the",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" weather"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " weather",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " for",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" San"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " San",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Francisco"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " Francisco",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " ,",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" CA"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " CA",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":":"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 0,
|
||||
Delta = new TextDelta()
|
||||
{
|
||||
Type = "text_delta",
|
||||
Text = " :",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_stop
|
||||
data: {"type":"content_block_stop","index":0}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockStop,
|
||||
Data = new ContentStopEventData()
|
||||
{
|
||||
Index = 0,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_start
|
||||
data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_weather","input":{}}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockStart,
|
||||
Data = new ContentStartEventData()
|
||||
{
|
||||
Index = 1,
|
||||
ContentBlock = new ToolUseContent()
|
||||
{
|
||||
Type = "tool_use",
|
||||
Id = "toolu_01T1x1fJ34qAmk2tNTrN7Up6",
|
||||
Name = "get_weather",
|
||||
Input = [],
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = "",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"location\":"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = "{\"location\":",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"San"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = " \"San",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" Francisc"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = " Francisc",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"o,"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = "o,",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" CA\""}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = " CA\"",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":", "}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = ", ",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\"unit\": \"fah"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = "\"unit\": \"fah",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_delta
|
||||
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"renheit\"}"}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockDelta,
|
||||
Data = new ContentDeltaEventData()
|
||||
{
|
||||
Index = 1,
|
||||
Delta = new JsonDelta()
|
||||
{
|
||||
Type = "input_json_delta",
|
||||
PartialJson = "renheit\"}",
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: content_block_stop
|
||||
data: {"type":"content_block_stop","index":1}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.ContentBlockStop,
|
||||
Data = new ContentStopEventData()
|
||||
{
|
||||
Index = 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: message_delta
|
||||
data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.MessageDelta,
|
||||
Data = new MessageDeltaEventData()
|
||||
{
|
||||
Delta = new MessageDelta()
|
||||
{
|
||||
StopReason = "tool_use",
|
||||
StopSequence = null,
|
||||
},
|
||||
Usage = new ChatUsage()
|
||||
{
|
||||
OutputTokens = 89,
|
||||
},
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
yield return new object[]
|
||||
{
|
||||
"""
|
||||
event: message_stop
|
||||
data: {"type":"message_stop"}
|
||||
""",
|
||||
new AnthropicEvent()
|
||||
{
|
||||
Type = EventType.MessageStop,
|
||||
Data = new MessageStopEventData(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
||||
}
|
||||
@@ -28,13 +28,13 @@ public static class MockHttpMessageHandlerExtensions
|
||||
{
|
||||
return mockHttpMessageHandler
|
||||
.SetupBaseRequest()
|
||||
.WithJsonContent<ChatMessageRequest>(r => r.Stream == false, JsonSerializationOptions.DefaultOptions);
|
||||
.WithJsonContent<MessageRequest>(r => r.Stream == false, JsonSerializationOptions.DefaultOptions);
|
||||
}
|
||||
|
||||
public static MockedRequest WhenCreateStreamMessageRequest(this MockHttpMessageHandler mockHttpMessageHandler)
|
||||
{
|
||||
return mockHttpMessageHandler
|
||||
.SetupBaseRequest()
|
||||
.WithJsonContent<StreamChatMessageRequest>(r => r.Stream == true, JsonSerializationOptions.DefaultOptions);
|
||||
.WithJsonContent<StreamMessageRequest>(r => r.Stream == true, JsonSerializationOptions.DefaultOptions);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user