Skip to content

Commit 1b7dd4c

Browse files
committed
feat: support reasoning switch for qwen3 models
1 parent 9f2f8a1 commit 1b7dd4c

11 files changed

+162
-1611
lines changed

src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public interface ITextGenerationParameters
4040
/// </summary>
4141
public bool? EnableSearch { get; }
4242

43+
/// <summary>
44+
/// Thinking option. Valid for supported models.(e.g. qwen3)
45+
/// </summary>
46+
public bool? EnableThinking { get; }
47+
4348
/// <summary>
4449
/// Available tools for model to call.
4550
/// </summary>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Cnblogs.DashScope.Core;
2+
3+
/// <summary>
4+
/// Output details for text generation api.
5+
/// </summary>
6+
/// <param name="ReasoningTokens">Token count of reasoning content.</param>
7+
public record TextGenerationOutputTokenDetails(int ReasoningTokens);

src/Cnblogs.DashScope.Core/TextGenerationParameters.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ public class TextGenerationParameters : ITextGenerationParameters
3838
/// <inheritdoc />
3939
public bool? EnableSearch { get; set; }
4040

41+
/// <inheritdoc />
42+
public bool? EnableThinking { get; set; }
43+
4144
/// <inheritdoc />
4245
public IEnumerable<ToolDefinition>? Tools { get; set; }
4346

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Cnblogs.DashScope.Core;
2+
3+
/// <summary>
4+
/// Token usage details.
5+
/// </summary>
6+
/// <param name="CachedTokens">Token count of cached input.</param>
7+
public record TextGenerationPromptTokenDetails(int CachedTokens);

src/Cnblogs.DashScope.Core/TextGenerationTokenDetails.cs

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/Cnblogs.DashScope.Core/TextGenerationTokenUsage.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ public class TextGenerationTokenUsage
1414
/// <summary>
1515
/// Input token details.
1616
/// </summary>
17-
public TextGenerationTokenDetails? PromptTokensDetails { get; set; }
17+
public TextGenerationPromptTokenDetails? PromptTokensDetails { get; set; }
18+
19+
/// <summary>
20+
/// Output token details.
21+
/// </summary>
22+
public TextGenerationOutputTokenDetails? OutputTokensDetails { get; set; }
1823

1924
/// <summary>
2025
/// The number of output token.

test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-nosse.request.body.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
]
1010
},
1111
"parameters": {
12-
"incremental_output": false
12+
"incremental_output": false,
13+
"result_format": "message"
1314
}
1415
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"model": "deepseek-r1",
2+
"model": "qwen-plus-latest",
33
"input": {
44
"messages": [
55
{
@@ -9,6 +9,8 @@
99
]
1010
},
1111
"parameters": {
12-
"incremental_output": true
12+
"incremental_output": true,
13+
"result_format": "message",
14+
"enable_thinking": true
1315
}
1416
}

test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.response.body.txt

Lines changed: 98 additions & 1583 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
HTTP/1.1 200 OK
22
vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers
3-
x-request-id: e4ad5d0f-8019-9716-adc6-eae1411d3c9a
3+
x-request-id: d21851a2-675b-97a3-9132-2935c31d6ee3
44
content-type: text/event-stream;charset=UTF-8
55
x-dashscope-call-gateway: true
66
x-dashscope-timeout: 180
77
x-dashscope-finished: false
8-
req-cost-time: 500
9-
req-arrive-time: 1742405632039
10-
resp-start-time: 1742405632540
11-
x-envoy-upstream-service-time: 490
12-
date: Wed, 19 Mar 2025 17:33:52 GMT
8+
req-cost-time: 482
9+
req-arrive-time: 1749445556927
10+
resp-start-time: 1749445557410
11+
x-envoy-upstream-service-time: 474
12+
date: Mon, 09 Jun 2025 05:05:57 GMT
1313
server: istio-envoy
1414
transfer-encoding: chunked

test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static class TextFormat
4343
InputTokens = 16,
4444
OutputTokens = 14,
4545
TotalTokens = 30,
46-
PromptTokensDetails = new TextGenerationTokenDetails(0)
46+
PromptTokensDetails = new TextGenerationPromptTokenDetails(0)
4747
}
4848
});
4949

@@ -148,7 +148,10 @@ public static class MessageFormat
148148
Messages =
149149
new List<TextChatMessage> { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly()
150150
},
151-
Parameters = new TextGenerationParameters { IncrementalOutput = false }
151+
Parameters = new TextGenerationParameters
152+
{
153+
IncrementalOutput = false, ResultFormat = ResultFormats.Message
154+
}
152155
},
153156
new ModelResponse<TextGenerationOutput, TextGenerationTokenUsage>
154157
{
@@ -163,7 +166,9 @@ public static class MessageFormat
163166
Message =
164167
TextChatMessage.Assistant(
165168
"1 + 1 等于 **2**。这是基础的算术加法,当我们将一个单位与另一个单位相加时,总和为两个单位。",
166-
reasoningContent: "嗯,用户问1加1等于多少。这个问题看起来很简单,但可能有一些需要注意的地方。首先,我得确认用户是不是真的在问基本的数学问题,还是有其他的意图,比如测试我的反应或者开玩笑。\n\n1加1在基础算术里确实是2,但有时候可能会有不同的解释,比如在二进制中1+1等于10,或者在逻辑学中有时候表示为1,如果是布尔代数的话。不过通常情况下,用户可能只需要最直接的答案,也就是2。\n\n不过也有可能用户想考察我是否能够处理更复杂的情况,或者是否有隐藏的意思。比如,在某些情况下,1加1可能被用来比喻合作的效果,比如“1+1大于2”,但这可能超出了当前问题的范围。\n\n我需要考虑用户的背景。如果用户是小学生,那么直接回答2是正确的,并且可能需要鼓励的话。如果是成年人,可能还是同样的答案,但不需要额外的解释。如果用户来自数学或计算机领域,可能需要确认是否需要其他进制的答案,但通常默认是十进制。\n\n另外,检查是否有拼写错误或非阿拉伯数字的情况,比如罗马数字的I+I,但问题里明确写的是1+1,所以应该是阿拉伯数字。\n\n总结下来,最安全也是最正确的答案就是2。不过为了确保,可以简短地确认用户的意图,但按照常规问题处理,直接回答即可。")
169+
null,
170+
null,
171+
"嗯,用户问1加1等于多少。这个问题看起来很简单,但可能有一些需要注意的地方。首先,我得确认用户是不是真的在问基本的数学问题,还是有其他的意图,比如测试我的反应或者开玩笑。\n\n1加1在基础算术里确实是2,但有时候可能会有不同的解释,比如在二进制中1+1等于10,或者在逻辑学中有时候表示为1,如果是布尔代数的话。不过通常情况下,用户可能只需要最直接的答案,也就是2。\n\n不过也有可能用户想考察我是否能够处理更复杂的情况,或者是否有隐藏的意思。比如,在某些情况下,1加1可能被用来比喻合作的效果,比如“1+1大于2”,但这可能超出了当前问题的范围。\n\n我需要考虑用户的背景。如果用户是小学生,那么直接回答2是正确的,并且可能需要鼓励的话。如果是成年人,可能还是同样的答案,但不需要额外的解释。如果用户来自数学或计算机领域,可能需要确认是否需要其他进制的答案,但通常默认是十进制。\n\n另外,检查是否有拼写错误或非阿拉伯数字的情况,比如罗马数字的I+I,但问题里明确写的是1+1,所以应该是阿拉伯数字。\n\n总结下来,最安全也是最正确的答案就是2。不过为了确保,可以简短地确认用户的意图,但按照常规问题处理,直接回答即可。")
167172
}
168173
}
169174
},
@@ -334,14 +339,19 @@ public static class MessageFormat
334339
"single-generation-message-reasoning",
335340
new ModelRequest<TextGenerationInput, ITextGenerationParameters>
336341
{
337-
Model = "deepseek-r1",
342+
Model = "qwen-plus-latest",
338343
Input =
339344
new TextGenerationInput
340345
{
341346
Messages =
342347
new List<TextChatMessage> { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly()
343348
},
344-
Parameters = new TextGenerationParameters { IncrementalOutput = true }
349+
Parameters = new TextGenerationParameters
350+
{
351+
IncrementalOutput = true,
352+
ResultFormat = ResultFormats.Message,
353+
EnableThinking = true
354+
}
345355
},
346356
new ModelResponse<TextGenerationOutput, TextGenerationTokenUsage>
347357
{
@@ -354,17 +364,20 @@ public static class MessageFormat
354364
{
355365
FinishReason = "stop",
356366
Message = TextChatMessage.Assistant(
357-
"1+1 在基础算术中的答案是 **2**。\n\n不过,根据不同的数学或逻辑系统,结果可能不同:\n- **二进制**:1+1 = 10(读作“一零”)。\n- **布尔代数**:1+1 = 1(逻辑“或”运算)。\n- **抽象场景**:如“1滴水 + 1滴水 = 1大滴水”(非数学意义的合并)。\n\n日常问题中默认使用十进制算术,因此答案是 **2** \ud83d\ude0a。",
358-
reasoningContent: "嗯,用户问1加1等于多少。这个问题看起来很简单,但其实可能有很多种情况需要考虑。首先,我得确定用户是不是在问数学上的基本加法。通常来说,1加1等于2,这是数学里的基本事实,根据皮亚诺公理或者基本的算术规则。不过,有时候问题可能有隐藏的含义,特别是在不同的语境下,答案可能会不同。比如在二进制中,1+1等于10,或者在布尔代数中,1+1可能等于1,如果是逻辑或运算的话。不过大部分情况下,尤其是在日常交流中,人们提到1+1的时候都是指十进制加法,结果自然是2。不过也有可能用户是在测试我的反应,或者想看看我会不会考虑其他可能性。比如在特定的谜语或笑话中,答案可能不是2,比如“1滴水加1滴水还是1滴水”,或者类似的文字游戏。但根据常规问题,我应该先给出正确的数学答案,再补充可能的其他情况,这样既准确又全面。所以可能先回答2,然后解释其他可能性。不过用户的问题看起来直接,可能不需要太复杂的解释,但为了保险起见,还是确认一下是否有其他意图比较好。或者用户可能只是单纯想知道答案,所以直接回答2即可。需要平衡简洁和全面性。可能先给出直接答案,然后简单说明其他情况的存在,这样既满足需求,又避免信息过载。总之,核心答案应该是2,但根据情况适当扩展。")
367+
"在数学中,**1 + 1 = 2**,这是基本的算术加法运算。 \n如果是在其他特殊语境下(例如编程中的字符串拼接、二进制计算,或比喻性表达),答案可能不同,但通常默认情况下,1+1的结果是**2**。",
368+
null,
369+
null,
370+
"嗯,用户问的是“1+1是多少?”这个问题看起来很简单,但可能需要考虑不同的上下文。首先,在数学中,1+1显然等于2,这是基本的算术。不过有时候可能会有其他解释,比如在编程里,字符串拼接的话结果可能是“11”。或者在某些比喻的情况下,比如两个人合作,可能会有不同的解释。不过用户没有给出具体的场景,所以应该默认是数学问题。\n\n接下来,我需要确认用户的需求。可能的情况是:他们真的在问数学问题,或者测试我的回答是否正确,或者想看看我会不会考虑其他可能性。比如,有些时候人们会开玩笑说1+1等于3,指的是家庭组成,但这种情况可能需要更多上下文。\n\n另外,用户可能有不同的教育背景,比如小孩子刚开始学数学,可能需要更详细的解释,但问题本身太基础,可能不需要深入。或者用户可能是在检查我的基本功能是否正常,所以回答要简洁准确。\n\n还要考虑是否存在其他可能的答案,比如在二进制中,1+1是10,但通常在十进制环境下还是回答2。不过如果用户有特定领域的需求,可能需要进一步询问。但根据问题本身,没有提示其他进制或特殊情境,所以应该以常规回答为主。\n\n总结下来,最稳妥的回答是先给出数学上的答案2,然后简要提到可能的其他情况,但说明通常默认是指数学加法。这样既准确又全面,避免误解。")
359371
}
360372
}
361373
},
362-
RequestId = "e4ad5d0f-8019-9716-adc6-eae1411d3c9a",
374+
RequestId = "d21851a2-675b-97a3-9132-2935c31d6ee3",
363375
Usage = new TextGenerationTokenUsage
364376
{
365-
TotalTokens = 417,
366-
OutputTokens = 406,
367-
InputTokens = 11
377+
TotalTokens = 394,
378+
OutputTokens = 378,
379+
InputTokens = 16,
380+
OutputTokensDetails = new TextGenerationOutputTokenDetails(306)
368381
}
369382
});
370383

0 commit comments

Comments
 (0)