diff --git a/Cnblogs.DashScope.Sdk.sln b/Cnblogs.DashScope.Sdk.sln index 165038d..2cb77fe 100644 --- a/Cnblogs.DashScope.Sdk.sln +++ b/Cnblogs.DashScope.Sdk.sln @@ -16,8 +16,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.DashScope.AspNetCor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.DashScope.Core", "src\Cnblogs.DashScope.Core\Cnblogs.DashScope.Core.csproj", "{CC389455-A3EA-4F09-B524-4DC351A1E1AA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.DashScope.Sdk.SnapshotGenerator", "test\Cnblogs.DashScope.Sdk.SnapshotGenerator\Cnblogs.DashScope.Sdk.SnapshotGenerator.csproj", "{5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.DashScope.AI", "src\Cnblogs.DashScope.AI\Cnblogs.DashScope.AI.csproj", "{5D5AD75A-8084-4738-AC56-B8A23E649452}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cnblogs.DashScope.AI.UnitTests", "test\Cnblogs.DashScope.AI.UnitTests\Cnblogs.DashScope.AI.UnitTests.csproj", "{25EE79E1-147B-42FD-AFEA-E1550EDD1D36}" @@ -35,7 +33,6 @@ Global {8885149A-78F0-4C8E-B9AA-87A46EA69219} = {2E15D1EC-4A07-416E-8BE6-D907F509FD35} {C910495B-87AB-4AC1-989C-B6720695A139} = {008988ED-0A3B-4272-BCC3-7B4110699345} {CC389455-A3EA-4F09-B524-4DC351A1E1AA} = {008988ED-0A3B-4272-BCC3-7B4110699345} - {5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1} = {CFC8ECB3-5248-46CD-A56C-EC088F2A3804} {5D5AD75A-8084-4738-AC56-B8A23E649452} = {008988ED-0A3B-4272-BCC3-7B4110699345} {25EE79E1-147B-42FD-AFEA-E1550EDD1D36} = {CFC8ECB3-5248-46CD-A56C-EC088F2A3804} {06F0AF23-445B-4C6F-9E19-570DA9B7435D} = {CFC8ECB3-5248-46CD-A56C-EC088F2A3804} @@ -61,10 +58,6 @@ Global {CC389455-A3EA-4F09-B524-4DC351A1E1AA}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC389455-A3EA-4F09-B524-4DC351A1E1AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {CC389455-A3EA-4F09-B524-4DC351A1E1AA}.Release|Any CPU.Build.0 = Release|Any CPU - {5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5088DE77-1CE3-46FB-B9D0-27A6C9A5EED1}.Release|Any CPU.Build.0 = Release|Any CPU {5D5AD75A-8084-4738-AC56-B8A23E649452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D5AD75A-8084-4738-AC56-B8A23E649452}.Debug|Any CPU.Build.0 = Debug|Any CPU {5D5AD75A-8084-4738-AC56-B8A23E649452}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs b/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs index 37a3849..9c3b763 100644 --- a/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs +++ b/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs @@ -4,7 +4,8 @@ namespace Cnblogs.DashScope.Core; /// The text generation options. /// public interface ITextGenerationParameters - : IIncrementalOutputParameter, ISeedParameter, IProbabilityParameter, IPenaltyParameter, IMaxTokenParameter, IStopTokenParameter + : IIncrementalOutputParameter, ISeedParameter, IProbabilityParameter, IPenaltyParameter, IMaxTokenParameter, + IStopTokenParameter { /// /// The format of the result, must be text or message. @@ -40,11 +41,31 @@ public interface ITextGenerationParameters /// public bool? EnableSearch { get; } + /// + /// Search options. should set to true. + /// + public TextGenerationSearchOptions? SearchOptions { get; set; } + /// /// Thinking option. Valid for supported models.(e.g. qwen3) /// public bool? EnableThinking { get; } + /// + /// Maximum length of thinking content. Valid for supported models.(e.g. qwen3) + /// + public int? ThinkingBudget { get; set; } + + /// + /// Include log possibilities in response. + /// + public bool? Logprobs { get; set; } + + /// + /// How many choices should be returned. Range: [0, 5] + /// + public int? TopLogprobs { get; set; } + /// /// Available tools for model to call. /// @@ -59,4 +80,9 @@ public interface ITextGenerationParameters /// Whether to enable parallel tool calling /// public bool? ParallelToolCalls { get; } + + /// + /// Options when using QWen-MT models. + /// + public TextGenerationTranslationOptions? TranslationOptions { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/Internals/ByteArrayLiteralConvertor.cs b/src/Cnblogs.DashScope.Core/Internals/ByteArrayLiteralConvertor.cs new file mode 100644 index 0000000..509e4c1 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/Internals/ByteArrayLiteralConvertor.cs @@ -0,0 +1,43 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Cnblogs.DashScope.Core.Internals; + +internal class ByteArrayLiteralConvertor : JsonConverter +{ + /// + public override byte[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.StartArray) + { + reader.Read(); // read out start of array + var list = new List(8); // should fit most tokens + while (reader.TokenType != JsonTokenType.EndArray) + { + list.Add(reader.GetByte()); + reader.Read(); + } + + return list.ToArray(); + } + + if (reader.TokenType == JsonTokenType.Null) + { + return null; + } + + return reader.GetBytesFromBase64(); + } + + /// + public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options) + { + writer.WriteStartArray(); + foreach (var b in value) + { + writer.WriteNumberValue(b); + } + + writer.WriteEndArray(); + } +} diff --git a/src/Cnblogs.DashScope.Core/TextGenerationChoice.cs b/src/Cnblogs.DashScope.Core/TextGenerationChoice.cs index 51eb4ac..faca9b9 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationChoice.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationChoice.cs @@ -14,4 +14,9 @@ public class TextGenerationChoice /// The generated message. /// public TextChatMessage Message { get; set; } = new(Array.Empty()); + + /// + /// Token array with log possibility info. + /// + public TextGenerationLogprobs? Logprobs { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/TextGenerationLogprobContent.cs b/src/Cnblogs.DashScope.Core/TextGenerationLogprobContent.cs new file mode 100644 index 0000000..c8b8b7d --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationLogprobContent.cs @@ -0,0 +1,18 @@ +using System.Text.Json.Serialization; +using Cnblogs.DashScope.Core.Internals; + +namespace Cnblogs.DashScope.Core; + +/// +/// Represents a possible choice of token. +/// +/// Token content. +/// Token content in UTF-8 byte array. +/// Possibility, null when it's too low. +/// The most possible alternatives. +public record TextGenerationLogprobContent( + string Token, + [property: JsonConverter(typeof(ByteArrayLiteralConvertor))] + byte[] Bytes, + float? Logprob, + List TopLogprobs); diff --git a/src/Cnblogs.DashScope.Core/TextGenerationLogprobs.cs b/src/Cnblogs.DashScope.Core/TextGenerationLogprobs.cs new file mode 100644 index 0000000..ba4a107 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationLogprobs.cs @@ -0,0 +1,7 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Possibilities of token choices. +/// +/// The choices with their possibility. +public record TextGenerationLogprobs(List Content); diff --git a/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs b/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs index 7288b8a..d0d43d8 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs @@ -19,4 +19,9 @@ public class TextGenerationOutput /// Not null when . is "message". /// public List? Choices { get; set; } + + /// + /// Not null when . configured to show source. + /// + public TextGenerationWebSearchInfo? SearchInfo { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs b/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs index 49800ed..fc2fee9 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs @@ -38,9 +38,21 @@ public class TextGenerationParameters : ITextGenerationParameters /// public bool? EnableSearch { get; set; } + /// + public TextGenerationSearchOptions? SearchOptions { get; set; } + /// public bool? EnableThinking { get; set; } + /// + public int? ThinkingBudget { get; set; } + + /// + public bool? Logprobs { get; set; } + + /// + public int? TopLogprobs { get; set; } + /// public IEnumerable? Tools { get; set; } @@ -50,6 +62,9 @@ public class TextGenerationParameters : ITextGenerationParameters /// public bool? ParallelToolCalls { get; set; } + /// + public TextGenerationTranslationOptions? TranslationOptions { get; set; } + /// public bool? IncrementalOutput { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/TextGenerationSearchOptions.cs b/src/Cnblogs.DashScope.Core/TextGenerationSearchOptions.cs new file mode 100644 index 0000000..d0d8cb4 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationSearchOptions.cs @@ -0,0 +1,32 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Web search options +/// +public class TextGenerationSearchOptions +{ + /// + /// Show search result in response. Defaults to false. + /// + public bool? EnableSource { get; set; } + + /// + /// Include citation in output. Defaults to false. + /// + public bool? EnableCitation { get; set; } + + /// + /// Citation format. Defaults to "[<number>]" + /// + public string? CitationFormat { get; set; } + + /// + /// Force model to use web search. Defaults to false. + /// + public bool? ForcedSearch { get; set; } + + /// + /// How many search records should be provided to model. "standard" - 5 records. "pro" - 10 records. + /// + public string? SearchStrategy { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/TextGenerationTopLogprobContent.cs b/src/Cnblogs.DashScope.Core/TextGenerationTopLogprobContent.cs new file mode 100644 index 0000000..9f19187 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationTopLogprobContent.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; +using Cnblogs.DashScope.Core.Internals; + +namespace Cnblogs.DashScope.Core; + +/// +/// Represents one choice of most possibility alternative tokens. +/// +/// The token content. +/// The token content in UTF-8 byte array. +/// Possibility, null when possibility is too low. +public record TextGenerationTopLogprobContent( + string Token, + [property: JsonConverter(typeof(ByteArrayLiteralConvertor))] + byte[] Bytes, + float? Logprob); diff --git a/src/Cnblogs.DashScope.Core/TextGenerationTranslationOptions.cs b/src/Cnblogs.DashScope.Core/TextGenerationTranslationOptions.cs new file mode 100644 index 0000000..d77f7c8 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationTranslationOptions.cs @@ -0,0 +1,32 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Configurations when using translation models. +/// +public class TextGenerationTranslationOptions +{ + /// + /// The language name of the input text. Use 'auto' to enable auto-detection. + /// + public string SourceLang { get; set; } = "auto"; + + /// + /// The language name of the output text. + /// + public string TargetLang { get; set; } = string.Empty; + + /// + /// Term list for translation. + /// + public IEnumerable? Terms { get; set; } + + /// + /// Sample texts for translation + /// + public IEnumerable? TmList { get; set; } + + /// + /// Domain info about the source text. Only supports English. + /// + public string? Domains { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/TextGenerationWebSearchInfo.cs b/src/Cnblogs.DashScope.Core/TextGenerationWebSearchInfo.cs new file mode 100644 index 0000000..27da418 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationWebSearchInfo.cs @@ -0,0 +1,7 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Web search information. +/// +/// Web search results. +public record TextGenerationWebSearchInfo(List SearchResults); diff --git a/src/Cnblogs.DashScope.Core/TextGenerationWebSearchResult.cs b/src/Cnblogs.DashScope.Core/TextGenerationWebSearchResult.cs new file mode 100644 index 0000000..ccdf085 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationWebSearchResult.cs @@ -0,0 +1,11 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represents one web search record. +/// +/// Source site name. +/// Source site favicon url. +/// Serial number of search records. +/// Page title. +/// Page url. +public record TextGenerationWebSearchResult(string SiteName, string Icon, int Index, string Title, string Url); diff --git a/src/Cnblogs.DashScope.Core/TranslationReference.cs b/src/Cnblogs.DashScope.Core/TranslationReference.cs new file mode 100644 index 0000000..256056a --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TranslationReference.cs @@ -0,0 +1,8 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// A text pair that used for translation reference. +/// +/// The text in source language. +/// The text in target language. +public record TranslationReference(string Source, string Target); diff --git a/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Cnblogs.DashScope.Sdk.SnapshotGenerator.csproj b/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Cnblogs.DashScope.Sdk.SnapshotGenerator.csproj deleted file mode 100644 index c23a53c..0000000 --- a/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Cnblogs.DashScope.Sdk.SnapshotGenerator.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net8.0 - Exe - false - - - - - - - diff --git a/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Program.cs b/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Program.cs deleted file mode 100644 index 83ba9e2..0000000 --- a/test/Cnblogs.DashScope.Sdk.SnapshotGenerator/Program.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Net; -using System.Text; - -const string basePath = "../../../../Cnblogs.DashScope.Sdk.UnitTests/RawHttpData"; -var snapshots = new DirectoryInfo(basePath); -Console.WriteLine("Reading key from environment variable DASHSCOPE_KEY"); -var apiKey = Environment.GetEnvironmentVariable("DASHSCOPE_API_KEY"); -if (string.IsNullOrEmpty(apiKey)) -{ - Console.Write("ApiKey > "); - apiKey = Console.ReadLine(); -} - -var handler = new SocketsHttpHandler { AutomaticDecompression = DecompressionMethods.All, }; -var client = new HttpClient(handler) { BaseAddress = new Uri("https://dashscope.aliyuncs.com/api/v1/") }; -client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}"); - -while (true) -{ - Console.Write("Snapshot Name > "); - var snapshotName = Console.ReadLine()?.Trim(); - if (string.IsNullOrEmpty(snapshotName)) - { - continue; - } - - var snapshot = snapshots.EnumerateFiles().Where(s => s.Name.StartsWith(snapshotName)) - .Select(s => s.Name.Split('.').First()).Distinct() - .ToList(); - if (snapshot.Count == 0) - { - Console.WriteLine($"No snapshot was found with name: {snapshotName}"); - } - - Console.WriteLine($"Updating {snapshot.Count} snapshots ..."); - foreach (var name in snapshot) - { - Console.WriteLine($"Updating {name}"); - await UpdateSnapshotsAsync(client, name); - Console.WriteLine($"{name} updated"); - } -} - -static async Task UpdateSnapshotsAsync(HttpClient client, string name) -{ - var requestHeader = await File.ReadAllLinesAsync(Path.Combine(basePath, $"{name}.request.header.txt")); - var requestBodyFile = Path.Combine(basePath, $"{name}.request.body.json"); - var requestBody = File.Exists(requestBodyFile) - ? await File.ReadAllTextAsync(Path.Combine(basePath, $"{name}.request.body.json")) - : string.Empty; - var firstLine = requestHeader[0].Split(' '); - var method = HttpMethod.Parse(firstLine[0]); - var request = new HttpRequestMessage(method, firstLine[1]); - var contentType = "application/json"; - foreach (var header in requestHeader.Skip(1)) - { - if (string.IsNullOrWhiteSpace(header)) - { - continue; - } - - var values = header.Split(':', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); - if (values[0] == "Content-Type") - { - contentType = values[1]; - continue; - } - - if (values[0] == "Content-Length") - { - continue; - } - - request.Headers.Add(values[0], values[1]); - } - - if (string.IsNullOrWhiteSpace(requestBodyFile) == false) - { - request.Content = new StringContent(requestBody, Encoding.Default, contentType); - } - - var response = await client.SendAsync(request); - var responseBody = await response.Content.ReadAsStringAsync(); - var responseHeaderFile = new StringBuilder(); - responseHeaderFile.AppendLine($"HTTP/1.1 {(int)response.StatusCode} {response.StatusCode}"); - responseHeaderFile = response.Headers.Aggregate( - responseHeaderFile, - (sb, pair) => sb.AppendLine($"{pair.Key}: {string.Join(',', pair.Value)}")); - await File.WriteAllTextAsync(Path.Combine(basePath, $"{name}.response.header.txt"), responseHeaderFile.ToString()); - await File.WriteAllTextAsync(Path.Combine(basePath, $"{name}.response.body.txt"), responseBody); -} diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs index 9a9406e..edc0bf4 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs @@ -155,7 +155,10 @@ public async Task ConversationCompletion_MessageFormatSse_SuccessAsync( Snapshots.TextGeneration.MessageFormat.SingleMessage, Snapshots.TextGeneration.MessageFormat.SingleMessageReasoning, Snapshots.TextGeneration.MessageFormat.SingleMessageWithTools, - Snapshots.TextGeneration.MessageFormat.SingleMessageJson); + Snapshots.TextGeneration.MessageFormat.SingleMessageJson, + Snapshots.TextGeneration.MessageFormat.SingleMessageLogprobs, + Snapshots.TextGeneration.MessageFormat.SingleMessageTranslation, + Snapshots.TextGeneration.MessageFormat.SingleMessageWebSearch); public static readonly TheoryData, ModelResponse>> SingleGenerationMessageSseFormatData = new( diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.body.json new file mode 100644 index 0000000..b47b634 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.body.json @@ -0,0 +1,22 @@ +{ + "model": "qwen-max", + "input": { + "messages": [ + { + "role": "user", + "content": "请问 1+1 是多少?请直接输出结果" + } + ] + }, + "parameters": { + "result_format": "message", + "seed": 1234, + "max_tokens": 1500, + "top_p": 0.8, + "top_k": 100, + "repetition_penalty": 1.1, + "temperature": 0.85, + "logprobs": true, + "top_logprobs": 2 + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.header.txt new file mode 100644 index 0000000..0c616aa --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/text-generation/generation HTTP/1.1 +Content-Type: application/json +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 592 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.body.txt new file mode 100644 index 0000000..57dfbe9 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.body.txt @@ -0,0 +1 @@ +{"output":{"choices":[{"finish_reason":"stop","message":{"role":"assistant","content":"2"},"logprobs":{"content":[{"top_logprobs":[{"logprob":0.0,"bytes":[50],"token":"2"}],"logprob":0.0,"bytes":[50],"token":"2"}]}}]},"usage":{"total_tokens":21,"output_tokens":1,"input_tokens":20,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"1d881da5-0028-9f20-8e7f-6bc7ae891c54"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.header.txt new file mode 100644 index 0000000..2799d49 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-logprobs-nosse.response.header.txt @@ -0,0 +1,15 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding +content-type: application/json +x-request-id: 1d881da5-0028-9f20-8e7f-6bc7ae891c54 +x-dashscope-call-gateway: true +x-dashscope-finished: true +x-dashscope-timeout: 298 +req-cost-time: 261 +req-arrive-time: 1751901115333 +resp-start-time: 1751901115594 +x-envoy-upstream-service-time: 252 +content-encoding: gzip +date: Mon, 07 Jul 2025 15:11:55 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.request.body.json index cfe607c..d44fefe 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.request.body.json +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.request.body.json @@ -9,8 +9,9 @@ ] }, "parameters": { - "incremental_output": true, "result_format": "message", - "enable_thinking": true + "incremental_output": true, + "enable_thinking": true, + "thinking_budget": 10 } } diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.response.body.txt index cc433c4..5e0bcd0 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-reasoning-sse.response.body.txt @@ -1,490 +1,65 @@ + id:1 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"嗯","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":19,"output_tokens":3,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":1}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"嗯","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":19,"output_tokens":3,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":1}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:2 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":20,"output_tokens":4,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":2}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":20,"output_tokens":4,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":2}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:3 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用户","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":21,"output_tokens":5,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":3}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用户","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":21,"output_tokens":5,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":3}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:4 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"问的是“1","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":25,"output_tokens":9,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":7}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"问的是“1","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":25,"output_tokens":9,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":7}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:5 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"+1是多少?”","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":29,"output_tokens":13,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":11}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"+1是多少","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":31,"output_tokens":15,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:6 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"这个问题看起来很简单,","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":33,"output_tokens":17,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":15}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"1+1","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":35,"output_tokens":19,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:7 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"但可能需要考虑","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":37,"output_tokens":21,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":19}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":" 等于 **","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":39,"output_tokens":23,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:8 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"不同的上下文。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":41,"output_tokens":25,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":23}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"2**。这是","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":43,"output_tokens":27,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:9 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"首先,在数学中","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":45,"output_tokens":29,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":27}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"数学中最基本的","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":47,"output_tokens":31,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:10 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",1+1","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":49,"output_tokens":33,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":31}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"加法运算之一","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":51,"output_tokens":35,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:11 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"显然等于2,","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":53,"output_tokens":37,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":35}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"。\n\n如果你有其他","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":55,"output_tokens":39,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:12 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"这是基本的算","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":57,"output_tokens":41,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":39}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"关于数学、科学","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":59,"output_tokens":43,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:13 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"术。不过有时候","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":61,"output_tokens":45,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":43}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"或任何领域的问题","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":63,"output_tokens":47,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:14 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能会有其他解释","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":65,"output_tokens":49,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":47}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":",欢迎继续提问","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":67,"output_tokens":51,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:15 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",比如在编程","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":69,"output_tokens":53,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":51}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"!😊","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":69,"output_tokens":53,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} id:16 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"里,字符串拼","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":73,"output_tokens":57,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":55}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:17 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"接的话结果可能是","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":77,"output_tokens":61,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":59}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:18 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"“11”。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":81,"output_tokens":65,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":63}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:19 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"或者在某些比喻","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":85,"output_tokens":69,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":67}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:20 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"的情况下,比如两个人","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":89,"output_tokens":73,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":71}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:21 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"合作,可能会有不同的","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":93,"output_tokens":77,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":75}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:22 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"解释。不过用户","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":97,"output_tokens":81,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":79}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:23 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"没有给出具体的场景","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":101,"output_tokens":85,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":83}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:24 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",所以应该默认","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":105,"output_tokens":89,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":87}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:25 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"是数学问题。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":109,"output_tokens":93,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":91}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:26 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"\n\n接下来,我需要","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":113,"output_tokens":97,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":95}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:27 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"确认用户的需求。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":117,"output_tokens":101,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":99}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:28 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能的情况是:","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":121,"output_tokens":105,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":103}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:29 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"他们真的在问","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":125,"output_tokens":109,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":107}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:30 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"数学问题,或者","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":129,"output_tokens":113,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":111}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:31 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"测试我的回答是否","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":133,"output_tokens":117,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":115}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:32 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"正确,或者想","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":137,"output_tokens":121,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":119}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:33 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"看看我会不会考虑","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":141,"output_tokens":125,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":123}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:34 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"其他可能性。比如","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":145,"output_tokens":129,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":127}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:35 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",有些时候人们","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":149,"output_tokens":133,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":131}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:36 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"会开玩笑说1","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":153,"output_tokens":137,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":135}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:37 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"+1等于3","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":157,"output_tokens":141,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":139}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:38 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",指的是家庭组成","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":161,"output_tokens":145,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":143}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:39 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",但这种情况可能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":165,"output_tokens":149,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":147}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:40 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"需要更多上下文","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":169,"output_tokens":153,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":151}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:41 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"。\n\n另外,用户","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":173,"output_tokens":157,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":155}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:42 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能有不同的教育背景","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":177,"output_tokens":161,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":159}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:43 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",比如小孩子刚开始","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":181,"output_tokens":165,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":163}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:44 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"学数学,可能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":185,"output_tokens":169,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":167}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:45 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"需要更详细的解释","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":189,"output_tokens":173,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":171}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:46 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",但问题本身","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":193,"output_tokens":177,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":175}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:47 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"太基础,可能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":197,"output_tokens":181,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":179}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:48 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"不需要深入。或者","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":201,"output_tokens":185,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":183}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:49 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用户可能是在检查","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":205,"output_tokens":189,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":187}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:50 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"我的基本功能是否","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":209,"output_tokens":193,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":191}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:51 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"正常,所以回答","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":213,"output_tokens":197,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":195}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:52 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"要简洁准确。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":217,"output_tokens":201,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":199}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:53 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"\n\n还要考虑是否存在其他","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":221,"output_tokens":205,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":203}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:54 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能的答案,比如","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":225,"output_tokens":209,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":207}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:55 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"在二进制","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":229,"output_tokens":213,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":211}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:56 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"中,1+","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":233,"output_tokens":217,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":215}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:57 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"1是10","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":237,"output_tokens":221,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":219}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:58 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",但通常在","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":241,"output_tokens":225,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":223}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:59 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"十进制环境下","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":245,"output_tokens":229,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":227}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:60 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"还是回答2。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":249,"output_tokens":233,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":231}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:61 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"不过如果用户有","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":253,"output_tokens":237,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":235}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:62 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"特定领域的需求,","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":257,"output_tokens":241,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":239}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:63 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能需要进一步询问","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":261,"output_tokens":245,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":243}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:64 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"。但根据问题","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":265,"output_tokens":249,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":247}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:65 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"本身,没有提示","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":269,"output_tokens":253,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":251}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:66 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"其他进制或","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":273,"output_tokens":257,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":255}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:67 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"特殊情境,所以","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":277,"output_tokens":261,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":259}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:68 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"应该以常规回答","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":281,"output_tokens":265,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":263}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:69 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"为主。\n\n总结下来","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":285,"output_tokens":269,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":267}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:70 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",最稳妥的回答","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":289,"output_tokens":273,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":271}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:71 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"是先给出数学","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":293,"output_tokens":277,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":275}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:72 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"上的答案2,","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":297,"output_tokens":281,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":279}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:73 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"然后简要提到","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":301,"output_tokens":285,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":283}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:74 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"可能的其他情况","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":305,"output_tokens":289,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":287}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:75 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",但说明通常","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":309,"output_tokens":293,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":291}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:76 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"默认是指数学","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":313,"output_tokens":297,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":295}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:77 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"加法。这样","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":317,"output_tokens":301,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":299}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:78 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"既准确又全面","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":321,"output_tokens":305,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":303}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:79 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",避免误解。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":325,"output_tokens":309,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":307}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:80 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"在数学","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":329,"output_tokens":313,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:81 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"中,**1","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":333,"output_tokens":317,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:82 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":" + 1 =","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":337,"output_tokens":321,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:83 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":" 2**,","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":341,"output_tokens":325,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:84 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"这是基本的算","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":345,"output_tokens":329,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:85 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"术加法运算","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":349,"output_tokens":333,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:86 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"。 \n如果是在","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":353,"output_tokens":337,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:87 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"其他特殊语境","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":357,"output_tokens":341,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:88 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"下(例如编程","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":361,"output_tokens":345,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:89 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"中的字符串拼接","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":365,"output_tokens":349,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:90 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"、二进制","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":369,"output_tokens":353,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:91 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"计算,或比喻","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":373,"output_tokens":357,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:92 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"性表达),答案","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":377,"output_tokens":361,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:93 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"可能不同,但","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":381,"output_tokens":365,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:94 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"通常默认情况下,","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":385,"output_tokens":369,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:95 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"1+1的结果","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":389,"output_tokens":373,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:96 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"是**2**","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":393,"output_tokens":377,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:97 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"。","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":394,"output_tokens":378,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - -id:98 -event:result -:HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":394,"output_tokens":378,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":306}},"request_id":"d21851a2-675b-97a3-9132-2935c31d6ee3"} - +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":69,"output_tokens":53,"input_tokens":16,"output_tokens_details":{"reasoning_tokens":10}},"request_id":"ab9f3446-9bbf-963e-9754-2d6543343d7e"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.body.json new file mode 100644 index 0000000..7a30117 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.body.json @@ -0,0 +1,22 @@ +{ + "model": "qwen-max", + "input": { + "messages": [ + { + "role": "user", + "content": "总结博客园 dudu 的最新博客" + } + ] + }, + "parameters": { + "result_format": "message", + "enable_search": true, + "search_options": { + "enable_source": true, + "enable_citation": true, + "citation_format": "[ref_]", + "forced_search": true, + "search_strategy": "standard" + } + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.header.txt new file mode 100644 index 0000000..8f77480 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/text-generation/generation HTTP/1.1 +Content-Type: application/json +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 592 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.body.txt new file mode 100644 index 0000000..ed84299 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.body.txt @@ -0,0 +1 @@ +{"output":{"search_info":{"search_results":[{"site_name":"CSDN - 专业开发者社区","icon":"https://img.alicdn.com/imgextra/i3/O1CN01QA3ndK1maJQ8rZTo1_!!6000000004970-55-tps-32-32.svg","index":1,"title":"我与博客园的20年转载","url":"https://blog.csdn.net/weixin_40884228/article/details/148485212"},{"site_name":"博客园","icon":"https://img.alicdn.com/imgextra/i2/O1CN01FzHbv01o253A3z2Gd_!!6000000005166-55-tps-32-32.svg","index":2,"title":"dudu - 博客园","url":"https://www.cnblogs.com/dudu"},{"site_name":"博客园","icon":"https://img.alicdn.com/imgextra/i2/O1CN01FzHbv01o253A3z2Gd_!!6000000005166-55-tps-32-32.svg","index":3,"title":"dudu - 博客园","url":"https://www.cnblogs.com/dudu?page=36"},{"site_name":"阿里云官方网站","icon":"https://img.alicdn.com/imgextra/i3/O1CN015NhUWq1Z1sdj3359l_!!6000000003135-55-tps-32-32.svg","index":4,"title":"玩转博客园的心路总结 - 阿里云开发者社区","url":"https://developer.aliyun.com/article/331235"},{"site_name":"CSDN - 专业开发者社区","icon":"https://img.alicdn.com/imgextra/i3/O1CN01QA3ndK1maJQ8rZTo1_!!6000000004970-55-tps-32-32.svg","index":5,"title":"为.NET程序员打工的站长——博客园dudu 原创","url":"https://blog.csdn.net/Microsoft_MVP/article/details/2416055"}]},"choices":[{"finish_reason":"stop","message":{"role":"assistant","content":"截至2025年6月7日,博客园的dudu站长发布的内容包括了技术分享和个人经历总结。以下是对dudu最近博客内容的一个概括:\n\n1. 代码重构经验分享:dudu在一篇博客中分享了他在博客园后台开发过程中遇到的一次代码重构经历。这次重构涉及到两个列表的合并(union),他需要实现一个自定义的`EqualityComparer`,基于列表元素的`Id`字段来进行比较,而不是默认的对象引用比较。这表明dudu在持续关注和改进博客园的技术架构,以确保其高效和可维护性。[ref_2]\n\n2. 开源工具介绍:另一篇博客介绍了名为NBearMapping的开源对象映射工具,该工具可用于不同类型的对象、DataRow以及DataReader之间的数据映射。dudu提到这个工具对于开发者来说非常有用,因为它可以简化数据层与业务逻辑层之间的交互。[ref_3]\n\n此外,还有关于个人与博客园共同成长的感想,提到了在过去20年间,无论是个人还是博客园本身都经历了巨大的变化。dudu也提到了自己正面临一些个人生活中的挑战,并表达了对博客园社区理解和支持的感激之情。[ref_1]\n\n这些博客不仅展示了dudu作为技术人员的专业知识和技术分享的热情,还反映了他对博客园这个平台的深厚感情和个人投入。如果您需要更详细的博客内容或有其他问题,请告知我以便提供进一步的帮助。"}}]},"usage":{"plugins":{"search":{"count":1}},"total_tokens":800,"output_tokens":304,"input_tokens":496,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"80753a20-2750-9ab6-bc2a-1b851ef43efc"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.header.txt new file mode 100644 index 0000000..8349277 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-search-nosse.response.header.txt @@ -0,0 +1,15 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding +content-type: application/json +x-request-id: 405d57ba-6cfc-9519-977f-0f519f712364 +x-dashscope-call-gateway: true +x-dashscope-finished: true +x-dashscope-timeout: 298 +req-cost-time: 810 +req-arrive-time: 1751899675324 +resp-start-time: 1751899676135 +x-envoy-upstream-service-time: 802 +content-encoding: gzip +date: Mon, 07 Jul 2025 14:47:55 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.body.json new file mode 100644 index 0000000..f4ea34c --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.body.json @@ -0,0 +1,32 @@ +{ + "model": "qwen-mt-plus", + "input": { + "messages": [ + { + "role": "user", + "content": "博客园的理念是代码改变世界" + } + ] + }, + "parameters": { + "result_format": "message", + "incremental_output": false, + "translation_options": { + "source_lang": "Chinese", + "target_lang": "English", + "terms": [ + { + "source": "博客园", + "target": "cnblogs" + } + ], + "tm_list": [ + { + "source": "代码改变世界", + "target": "Coding changes world" + } + ], + "domains": "This text is a promotion." + } + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.header.txt new file mode 100644 index 0000000..28fb683 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/text-generation/generation HTTP/1.1 +Content-Type: application/json +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 85 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.body.txt new file mode 100644 index 0000000..10105ce --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.body.txt @@ -0,0 +1 @@ +{"output":{"finish_reason":"stop","model_name":"qwen-mt-plus","choices":[{"finish_reason":"stop","message":{"role":"assistant","content":"The concept of cnblogs is that coding changes world "}}]},"usage":{"total_tokens":122,"output_tokens":11,"input_tokens":111},"request_id":"bf86e0f9-a8a2-9b32-be8d-ea3cae47c8ea"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.header.txt new file mode 100644 index 0000000..7fd842a --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-translation-nosse.response.header.txt @@ -0,0 +1,15 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding +content-type: application/json +x-request-id: bf86e0f9-a8a2-9b32-be8d-ea3cae47c8ea +x-dashscope-call-gateway: true +x-dashscope-finished: true +x-dashscope-timeout: 180 +req-cost-time: 823 +req-arrive-time: 1751904150645 +resp-start-time: 1751904151468 +x-envoy-upstream-service-time: 812 +content-encoding: gzip +date: Mon, 07 Jul 2025 16:02:30 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs index 2bf4461..65e5747 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs @@ -95,7 +95,7 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { @@ -146,7 +146,7 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { @@ -192,7 +192,7 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { @@ -230,6 +230,180 @@ public static class MessageFormat } }); + public static readonly RequestSnapshot, + ModelResponse> + SingleMessageLogprobs = new( + "single-generation-message-logprobs", + new ModelRequest + { + Model = "qwen-max", + Input = + new TextGenerationInput + { + Messages = + new List { TextChatMessage.User("请问 1+1 是多少?请直接输出结果") } + }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + Seed = 1234, + MaxTokens = 1500, + TopP = 0.8f, + TopK = 100, + RepetitionPenalty = 1.1f, + Temperature = 0.85f, + Logprobs = true, + TopLogprobs = 2 + } + }, + new ModelResponse + { + Output = new TextGenerationOutput + { + Choices = + new List + { + new() + { + FinishReason = "stop", + Message = TextChatMessage.Assistant("2"), + Logprobs = new TextGenerationLogprobs( + new List() + { + new( + "2", + new byte[] { 50 }, + 0.0f, + new List() + { + new("2", new byte[] { 50 }, 0.0f) + }), + }) + } + } + }, + RequestId = "1d881da5-0028-9f20-8e7f-6bc7ae891c54", + Usage = new TextGenerationTokenUsage + { + TotalTokens = 21, + OutputTokens = 1, + InputTokens = 20, + PromptTokensDetails = new TextGenerationPromptTokenDetails(0) + } + }); + + public static readonly RequestSnapshot, + ModelResponse> + SingleMessageTranslation = new( + "single-generation-message-translation", + new ModelRequest + { + Model = "qwen-mt-plus", + Input = + new TextGenerationInput + { + Messages = + new List { TextChatMessage.User("博客园的理念是代码改变世界") } + }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + IncrementalOutput = false, + TranslationOptions = new TextGenerationTranslationOptions() + { + SourceLang = "Chinese", + TargetLang = "English", + Domains = "This text is a promotion.", + Terms = new List() { new("博客园", "cnblogs") }, + TmList = new List() { new("代码改变世界", "Coding changes world") } + } + } + }, + new ModelResponse + { + Output = new TextGenerationOutput + { + FinishReason = "stop", + Choices = + new List + { + new() + { + FinishReason = "stop", + Message = TextChatMessage.Assistant( + "The concept of cnblogs is that coding changes world "), + } + } + }, + RequestId = "bf86e0f9-a8a2-9b32-be8d-ea3cae47c8ea", + Usage = new TextGenerationTokenUsage + { + TotalTokens = 122, + OutputTokens = 11, + InputTokens = 111, + } + }); + + public static readonly RequestSnapshot, + ModelResponse> + SingleMessageWebSearch = new( + "single-generation-message-search", + new ModelRequest + { + Model = "qwen-max", + Input = + new TextGenerationInput + { + Messages = + new List { TextChatMessage.User("总结博客园 dudu 的最新博客") } + }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + EnableSearch = true, + SearchOptions = new TextGenerationSearchOptions() + { + EnableSource = true, + EnableCitation = true, + CitationFormat = "[ref_]", + ForcedSearch = true, + SearchStrategy = "standard" + } + } + }, + new ModelResponse + { + Output = new TextGenerationOutput + { + Choices = + new List + { + new() + { + FinishReason = "stop", + Message = TextChatMessage.Assistant( + "截至2025年6月7日,博客园的dudu站长发布的内容包括了技术分享和个人经历总结。以下是对dudu最近博客内容的一个概括:\n\n1. 代码重构经验分享:dudu在一篇博客中分享了他在博客园后台开发过程中遇到的一次代码重构经历。这次重构涉及到两个列表的合并(union),他需要实现一个自定义的`EqualityComparer`,基于列表元素的`Id`字段来进行比较,而不是默认的对象引用比较。这表明dudu在持续关注和改进博客园的技术架构,以确保其高效和可维护性。[ref_2]\n\n2. 开源工具介绍:另一篇博客介绍了名为NBearMapping的开源对象映射工具,该工具可用于不同类型的对象、DataRow以及DataReader之间的数据映射。dudu提到这个工具对于开发者来说非常有用,因为它可以简化数据层与业务逻辑层之间的交互。[ref_3]\n\n此外,还有关于个人与博客园共同成长的感想,提到了在过去20年间,无论是个人还是博客园本身都经历了巨大的变化。dudu也提到了自己正面临一些个人生活中的挑战,并表达了对博客园社区理解和支持的感激之情。[ref_1]\n\n这些博客不仅展示了dudu作为技术人员的专业知识和技术分享的热情,还反映了他对博客园这个平台的深厚感情和个人投入。如果您需要更详细的博客内容或有其他问题,请告知我以便提供进一步的帮助。"), + } + }, + SearchInfo = new TextGenerationWebSearchInfo(new List() + { + new("CSDN - 专业开发者社区", "https://img.alicdn.com/imgextra/i3/O1CN01QA3ndK1maJQ8rZTo1_!!6000000004970-55-tps-32-32.svg", 1, "我与博客园的20年转载", "https://blog.csdn.net/weixin_40884228/article/details/148485212"), + new("博客园", "https://img.alicdn.com/imgextra/i2/O1CN01FzHbv01o253A3z2Gd_!!6000000005166-55-tps-32-32.svg", 2, "dudu - 博客园", "https://www.cnblogs.com/dudu"), + new("博客园", "https://img.alicdn.com/imgextra/i2/O1CN01FzHbv01o253A3z2Gd_!!6000000005166-55-tps-32-32.svg", 3, "dudu - 博客园", "https://www.cnblogs.com/dudu?page=36"), + new("阿里云官方网站", "https://img.alicdn.com/imgextra/i3/O1CN015NhUWq1Z1sdj3359l_!!6000000003135-55-tps-32-32.svg", 4, "玩转博客园的心路总结 - 阿里云开发者社区", "https://developer.aliyun.com/article/331235"), + new("CSDN - 专业开发者社区", "https://img.alicdn.com/imgextra/i3/O1CN01QA3ndK1maJQ8rZTo1_!!6000000004970-55-tps-32-32.svg", 5, "为.NET程序员打工的站长——博客园dudu 原创", "https://blog.csdn.net/Microsoft_MVP/article/details/2416055") + }) + }, + RequestId = "80753a20-2750-9ab6-bc2a-1b851ef43efc", + Usage = new TextGenerationTokenUsage + { + TotalTokens = 800, + OutputTokens = 304, + InputTokens = 496, + PromptTokensDetails = new TextGenerationPromptTokenDetails(0) + } + }); + public static readonly RequestSnapshot, ModelResponse> SingleMessageJson = new( @@ -242,7 +416,6 @@ public static class MessageFormat { Messages = new List { TextChatMessage.User("请问 1+1 是多少?用 JSON 格式输出。") } - .AsReadOnly() }, Parameters = new TextGenerationParameters { @@ -293,7 +466,7 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { @@ -344,13 +517,14 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { IncrementalOutput = true, ResultFormat = ResultFormats.Message, - EnableThinking = true + EnableThinking = true, + ThinkingBudget = 10 } }, new ModelResponse @@ -364,20 +538,20 @@ public static class MessageFormat { FinishReason = "stop", Message = TextChatMessage.Assistant( - "在数学中,**1 + 1 = 2**,这是基本的算术加法运算。 \n如果是在其他特殊语境下(例如编程中的字符串拼接、二进制计算,或比喻性表达),答案可能不同,但通常默认情况下,1+1的结果是**2**。", + "1+1 等于 **2**。这是数学中最基本的加法运算之一。\n\n如果你有其他关于数学、科学或任何领域的问题,欢迎继续提问!😊", null, null, - "嗯,用户问的是“1+1是多少?”这个问题看起来很简单,但可能需要考虑不同的上下文。首先,在数学中,1+1显然等于2,这是基本的算术。不过有时候可能会有其他解释,比如在编程里,字符串拼接的话结果可能是“11”。或者在某些比喻的情况下,比如两个人合作,可能会有不同的解释。不过用户没有给出具体的场景,所以应该默认是数学问题。\n\n接下来,我需要确认用户的需求。可能的情况是:他们真的在问数学问题,或者测试我的回答是否正确,或者想看看我会不会考虑其他可能性。比如,有些时候人们会开玩笑说1+1等于3,指的是家庭组成,但这种情况可能需要更多上下文。\n\n另外,用户可能有不同的教育背景,比如小孩子刚开始学数学,可能需要更详细的解释,但问题本身太基础,可能不需要深入。或者用户可能是在检查我的基本功能是否正常,所以回答要简洁准确。\n\n还要考虑是否存在其他可能的答案,比如在二进制中,1+1是10,但通常在十进制环境下还是回答2。不过如果用户有特定领域的需求,可能需要进一步询问。但根据问题本身,没有提示其他进制或特殊情境,所以应该以常规回答为主。\n\n总结下来,最稳妥的回答是先给出数学上的答案2,然后简要提到可能的其他情况,但说明通常默认是指数学加法。这样既准确又全面,避免误解。") + "嗯,用户问的是“1+1是多少") } } }, - RequestId = "d21851a2-675b-97a3-9132-2935c31d6ee3", + RequestId = "ab9f3446-9bbf-963e-9754-2d6543343d7e", Usage = new TextGenerationTokenUsage { - TotalTokens = 394, - OutputTokens = 378, + TotalTokens = 69, + OutputTokens = 53, InputTokens = 16, - OutputTokensDetails = new TextGenerationOutputTokenDetails(306) + OutputTokensDetails = new TextGenerationOutputTokenDetails(ReasoningTokens: 10) } }); @@ -392,7 +566,7 @@ public static class MessageFormat new TextGenerationInput { Messages = - new List { TextChatMessage.User("请问 1+1 是多少?") }.AsReadOnly() + new List { TextChatMessage.User("请问 1+1 是多少?") } }, Parameters = new TextGenerationParameters { @@ -443,7 +617,7 @@ public static readonly Input = new TextGenerationInput { Messages = - new List { TextChatMessage.User("杭州现在的天气如何?") }.AsReadOnly() + new List { TextChatMessage.User("杭州现在的天气如何?") } }, Parameters = new TextGenerationParameters { @@ -473,7 +647,7 @@ public static readonly PropertyNameResolvers.LowerSnakeCase }) .Build())) - }.AsReadOnly(), + }, ToolChoice = ToolChoice.FunctionChoice("get_current_weather") } }, @@ -523,7 +697,7 @@ public static readonly Input = new TextGenerationInput { Messages = - new List { TextChatMessage.User("杭州现在的天气如何?") }.AsReadOnly() + new List { TextChatMessage.User("杭州现在的天气如何?") } }, Parameters = new TextGenerationParameters { @@ -550,7 +724,7 @@ public static readonly PropertyNameResolvers.LowerSnakeCase }) .Build())) - }.AsReadOnly(), + }, ToolChoice = ToolChoice.FunctionChoice("get_current_weather") } }, @@ -603,7 +777,7 @@ public static readonly { TextChatMessage.User("请对“春天来了,大地”这句话进行续写,来表达春天的美好和作者的喜悦之情"), TextChatMessage.Assistant("春天来了,大地", true) - }.AsReadOnly() + } }, Parameters = new TextGenerationParameters { @@ -658,7 +832,7 @@ public static readonly TextChatMessage.User("现在请你记住一个数字,42"), TextChatMessage.Assistant("好的,我已经记住了这个数字。"), TextChatMessage.User("请问我刚才提到的数字是多少?") - }.AsReadOnly() + } }, Parameters = new TextGenerationParameters { @@ -715,9 +889,9 @@ public static readonly { "file-fe-WTTG89tIUTd4ByqP3K48R3bn", "file-fe-l92iyRvJm9vHCCfonLckf1o2" - }.AsReadOnly()), + }), TextChatMessage.User("这两个文件是相同的吗?") - }.AsReadOnly() + } }, Parameters = new TextGenerationParameters {