handling-stop-reasons changedbuild-with-claude/handling-stop-reasons
Nearest release: v2.1.307, published 4 hours after this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Recorded here
Lines+50added
Lines−70removed
From line
109
where the diff opens
First seen
14 Aug 2026
this site's first read of the page
Recorded edits19to this page, all time
The whole hunk
from line 109, old and new numbered
/
from line 109
109109 {
110110 Model = Model.ClaudeOpus5_5,
111111 MaxTokens = 1024,
112 Messages = [new() { Role = Role.User, Content = "Hello!" }]
112 Messages = [new UserMessageParam { Content = "Hello!" }]
113113 });
114114
115115 if (response.StopReason == "end_turn")
from line 323
323323 // INCORRECT: Adding text immediately after tool_result
324324 List<MessageParam> messages =
325325 [
326 new() { Role = Role.User, Content = "Calculate the sum of 1234 and 5678" },
327 new()
326 new UserMessageParam { Content = "Calculate the sum of 1234 and 5678" },
327 new AssistantMessageParam
328328 {
329 Role = Role.Assistant,
330329 Content = new List<ContentBlockParam>
331330 {
332331 new ToolUseBlockParam { ID = "toolu_123", Name = "calculator", Input = input }
333332 }
334333 },
335 new()
334 new UserMessageParam
336335 {
337 Role = Role.User,
338336 Content = new List<ContentBlockParam>
339337 {
340338 new ToolResultBlockParam { ToolUseID = "toolu_123", Content = "6912" },
from line 344
346344 // CORRECT: Send tool results directly without additional text
347345 messages =
348346 [
349 new() { Role = Role.User, Content = "Calculate the sum of 1234 and 5678" },
350 new()
347 new UserMessageParam { Content = "Calculate the sum of 1234 and 5678" },
348 new AssistantMessageParam
351349 {
352 Role = Role.Assistant,
353350 Content = new List<ContentBlockParam>
354351 {
355352 new ToolUseBlockParam { ID = "toolu_123", Name = "calculator", Input = input }
356353 }
357354 },
358 new()
355 new UserMessageParam
359356 {
360 Role = Role.User,
361357 // Just the tool_result, no additional text
362358 Content = new List<ContentBlockParam>
363359 {
from line 404
408404
409405 // INCORRECT: Adding text immediately after tool_result
410406 List<MessageParam> messages = List.of(
411 MessageParam.builder().role(MessageParam.Role.USER)
412 .content("Calculate the sum of 1234 and 5678").build(),
413 MessageParam.builder().role(MessageParam.Role.ASSISTANT)
414 .contentOfBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))).build(),
415 MessageParam.builder().role(MessageParam.Role.USER)
416 .contentOfBlockParams(List.of(
417 ContentBlockParam.ofToolResult(
418 ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()),
419 // Don't add text after tool_result
420 ContentBlockParam.ofText(TextBlockParam.builder().text("Here's the result").build())
421 )).build()
407 MessageParam.ofUser("Calculate the sum of 1234 and 5678"),
408 MessageParam.ofAssistantOfContentBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))),
409 MessageParam.ofUserOfContentBlockParams(List.of(
410 ContentBlockParam.ofToolResult(
411 ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build()),
412 // Don't add text after tool_result
413 ContentBlockParam.ofText(TextBlockParam.builder().text("Here's the result").build())
414 ))
422415 );
423416
424417 // CORRECT: Send tool results directly without additional text
425418 messages = List.of(
426 MessageParam.builder().role(MessageParam.Role.USER)
427 .content("Calculate the sum of 1234 and 5678").build(),
428 MessageParam.builder().role(MessageParam.Role.ASSISTANT)
429 .contentOfBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))).build(),
419 MessageParam.ofUser("Calculate the sum of 1234 and 5678"),
420 MessageParam.ofAssistantOfContentBlockParams(List.of(ContentBlockParam.ofToolUse(toolUse))),
430421 // Just the tool_result, no additional text
431 MessageParam.builder().role(MessageParam.Role.USER)
432 .contentOfBlockParams(List.of(
433 ContentBlockParam.ofToolResult(
434 ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build())
435 )).build()
422 MessageParam.ofUserOfContentBlockParams(List.of(
423 ContentBlockParam.ofToolResult(
424 ToolResultBlockParam.builder().toolUseId("toolu_123").content("6912").build())
425 ))
436426 );
437427 ```
438428
from line 593
603593 if (response.StopReason == "end_turn" && response.Content.Count == 0)
604594 {
605595 // CORRECT: Add a continuation prompt in a NEW user message
606 messages.Add(new() { Role = Role.User, Content = "Please continue" });
596 messages.Add(new UserMessageParam { Content = "Please continue" });
607597
608598 response = await client.Messages.Create(new MessageCreateParams
609599 {
from line 652
662652 if (isEndTurn && response.content().isEmpty()) {
663653 // CORRECT: Add a continuation prompt in a NEW user message
664654 List<MessageParam> extended = new ArrayList<>(messages);
665 extended.add(MessageParam.builder()
666 .role(MessageParam.Role.USER)
667 .content("Please continue")
668 .build());
655 extended.add(MessageParam.ofUser("Please continue"));
669656
670657 response = client.messages().create(
671658 MessageCreateParams.builder()
from line 788
801788 {
802789 Model = Model.ClaudeOpus5_5,
803790 MaxTokens = 10,
804 Messages = [new() { Role = Role.User, Content = "Explain quantum physics" }]
791 Messages = [new UserMessageParam { Content = "Explain quantum physics" }]
805792 });
806793
807794 if (response.StopReason == "max_tokens")
from line 1098
11111098 Model = Model.ClaudeOpus5_5,
11121099 MaxTokens = 1024,
11131100 StopSequences = ["END", "STOP"],
1114 Messages = [new() { Role = Role.User, Content = "Generate text until you say END" }]
1101 Messages = [new UserMessageParam { Content = "Generate text until you say END" }]
11151102 });
11161103
11171104 if (response.StopReason == "stop_sequence")
from line 1319
13321319 Model = Model.ClaudeOpus5_5,
13331320 MaxTokens = 1024,
13341321 Tools = [weatherTool],
1335 Messages = [new() { Role = Role.User, Content = "What is the weather in San Francisco?" }]
1322 Messages = [new UserMessageParam { Content = "What is the weather in San Francisco?" }]
13361323 });
13371324
13381325 if (response.StopReason == "tool_use")
from line 1600
16131600
16141601 ```csharp C#
16151602 List<ToolUnion> tools = [new ToolUnion(new WebSearchTool20250305())];
1616 MessageParam userMessage = new() { Role = Role.User, Content = "Search for latest AI news" };
1603 MessageParam userMessage = new UserMessageParam { Content = "Search for latest AI news" };
16171604
16181605 var response = await client.Messages.Create(new MessageCreateParams
16191606 {
from line 1621
16341621 Messages =
16351622 [
16361623 userMessage,
1637 new()
1624 new AssistantMessageParam
16381625 {
1639 Role = Role.Assistant,
16401626 Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList()
16411627 }
16421628 ]
from line 1802
18161802 {
18171803 Model = Model.ClaudeOpus5_5,
18181804 MaxTokens = 1024,
1819 Messages = [new() { Role = Role.User, Content = "[Unsafe request]" }]
1805 Messages = [new UserMessageParam { Content = "[Unsafe request]" }]
18201806 });
18211807
18221808 if (response.StopReason == "refusal")
from line 1961
19751961 {
19761962 Model = Model.ClaudeOpus5_5,
19771963 MaxTokens = 20000,
1978 Messages = [new() { Role = Role.User, Content = "Large input that uses most of context window..." }]
1964 Messages = [new BetaUserMessageParam { Content = "Large input that uses most of context window..." }]
19791965 });
19801966
19811967 if (response.StopReason?.Value() == BetaStopReason.ModelContextWindowExceeded)
from line 2396
24102396 List<ToolUnion> tools,
24112397 int maxContinuations = 5)
24122398 {
2413 List<MessageParam> messages = [new() { Role = Role.User, Content = userQuery }];
2399 List<MessageParam> messages = [new UserMessageParam { Content = userQuery }];
24142400 Message response = null!;
24152401
24162402 for (var i = 0; i < maxContinuations; i++)
from line 2418
24322418 // pause_turn: replace the full message list to maintain alternating roles
24332419 messages =
24342420 [
2435 new() { Role = Role.User, Content = userQuery },
2436 new()
2421 new UserMessageParam { Content = userQuery },
2422 new AssistantMessageParam
24372423 {
2438 Role = Role.Assistant,
24392424 Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList()
24402425 }
24412426 ];
from line 2674
26892674 {
26902675 Model = Model.ClaudeOpus5_5,
26912676 MaxTokens = 1024,
2692 Messages = [new() { Role = Role.User, Content = "Hello!" }]
2677 Messages = [new UserMessageParam { Content = "Hello!" }]
26932678 });
26942679
26952680 // Handle successful response with stop_reason
from line 2864
28792864 {
28802865 Model = Model.ClaudeOpus5_5,
28812866 MaxTokens = 1024,
2882 Messages = [new() { Role = Role.User, Content = "Hello!" }]
2867 Messages = [new UserMessageParam { Content = "Hello!" }]
28832868 };
28842869
28852870 await foreach (var streamEvent in client.Messages.CreateStreaming(parameters))
from line 3025
30403025 string userQuery,
30413026 List<ToolUnion> tools)
30423027 {
3043 List<MessageParam> messages = [new() { Role = Role.User, Content = userQuery }];
3028 List<MessageParam> messages = [new UserMessageParam { Content = userQuery }];
30443029
30453030 while (true)
30463031 {
from line 3041
30563041 {
30573042 // Execute tools and continue
30583043 var toolResults = ExecuteTools(response.Content);
3059 messages.Add(new()
3044 messages.Add(new AssistantMessageParam
30603045 {
3061 Role = Role.Assistant,
30623046 Content = response.Content.Select(block => new ContentBlockParam(block.Json)).ToList()
30633047 });
3064 messages.Add(new() { Role = Role.User, Content = toolResults });
3048 messages.Add(new UserMessageParam { Content = toolResults });
30653049 }
30663050 else
30673051 {
from line 3099
31153099 List<Tool> tools
31163100 ) {
31173101 List<MessageParam> messages = new ArrayList<>();
3118 messages.add(MessageParam.builder().role(MessageParam.Role.USER).content(userQuery).build());
3102 messages.add(MessageParam.ofUser(userQuery));
31193103
31203104 while (true) {
31213105 MessageCreateParams.Builder params = MessageCreateParams.builder()
from line 3118
31343118 // Execute tools and continue
31353119 List<ToolResultBlockParam> toolResults = executeTools(response.content());
31363120 messages.add(response.toParam());
3137 messages.add(MessageParam.builder()
3138 .role(MessageParam.Role.USER)
3139 .contentOfBlockParams(toolResults.stream().map(ContentBlockParam::ofToolResult).toList())
3140 .build());
3121 messages.add(MessageParam.ofUserOfContentBlockParams(
3122 toolResults.stream().map(ContentBlockParam::ofToolResult).toList()));
31413123 }
31423124 }
31433125 ```
from line 3242
32603242 ```csharp C#
32613243 static async Task<string> GetCompleteResponse(AnthropicClient client, string prompt, int maxAttempts = 3)
32623244 {
3263 List<MessageParam> messages = [new() { Role = Role.User, Content = prompt }];
3245 List<MessageParam> messages = [new UserMessageParam { Content = prompt }];
32643246 var fullResponse = "";
32653247
32663248 for (var i = 0; i < maxAttempts; i++)
from line 3271
32893271 // Continue from where it left off
32903272 messages =
32913273 [
3292 new() { Role = Role.User, Content = prompt },
3293 new() { Role = Role.Assistant, Content = fullResponse },
3294 new() { Role = Role.User, Content = "Please continue from where you left off." }
3274 new UserMessageParam { Content = prompt },
3275 new AssistantMessageParam { Content = fullResponse },
3276 new UserMessageParam { Content = "Please continue from where you left off." }
32953277 ];
32963278 }
32973279
from line 3321
33393321
33403322 ```java Java
33413323 static String getCompleteResponse(AnthropicClient client, String prompt, int maxAttempts) {
3342 List<MessageParam> messages = List.of(
3343 MessageParam.builder().role(MessageParam.Role.USER).content(prompt).build()
3344 );
3324 List<MessageParam> messages = List.of(MessageParam.ofUser(prompt));
33453325 StringBuilder fullResponse = new StringBuilder();
33463326
33473327 for (int i = 0; i < maxAttempts; i++) {
from line 3344
33643344
33653345 // Continue from where it left off
33663346 messages = List.of(
3367 MessageParam.builder().role(MessageParam.Role.USER).content(prompt).build(),
3368 MessageParam.builder().role(MessageParam.Role.ASSISTANT).content(fullResponse.toString()).build(),
3369 MessageParam.builder().role(MessageParam.Role.USER).content("Please continue from where you left off.").build()
3347 MessageParam.ofUser(prompt),
3348 MessageParam.ofAssistant(fullResponse.toString()),
3349 MessageParam.ofUser("Please continue from where you left off.")
33703350 );
33713351 }
33723352
from line 3489
35093489 {
35103490 Model = Model.ClaudeOpus5_5,
35113491 MaxTokens = 20000,
3512 Messages = [new() { Role = Role.User, Content = prompt }]
3492 Messages = [new BetaUserMessageParam { Content = prompt }]
35133493 });
35143494
35153495 var tokens = response.Usage.OutputTokens;
No line in this hunk matches that.