From 78d83076ed1ccb8af6f8308f523c3ed5b62bf4aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=88=E6=98=9F=E7=B9=81?= Date: Mon, 1 Dec 2025 00:09:52 +0800 Subject: [PATCH] feat: add doc url tests --- .../DashScopeChatClient.cs | 2 +- .../TextChatMessageContentConvertor.cs | 62 +++ .../TextChatMessageContentInternal.cs | 9 + src/Cnblogs.DashScope.Core/TextChatMessage.cs | 17 +- .../TextChatMessageContent.cs | 62 +++ .../TextGenerationTokenUsage.cs | 5 + .../FileSerializationTests.cs | 1 - ...extChatMessageContentJsonConvertorTests.cs | 97 ++++ .../TextGenerationSerializationTests.cs | 3 +- ...message-with-doc-url-sse.request.body.json | 32 ++ ...essage-with-doc-url-sse.request.header.txt | 8 + ...message-with-doc-url-sse.response.body.txt | 465 ++++++++++++++++++ ...ssage-with-doc-url-sse.response.header.txt | 27 + .../Utils/Snapshots.TextGeneration.cs | 55 ++- .../Utils/Snapshots.cs | 2 + 15 files changed, 839 insertions(+), 8 deletions(-) create mode 100644 src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs create mode 100644 src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentInternal.cs create mode 100644 src/Cnblogs.DashScope.Core/TextChatMessageContent.cs create mode 100644 test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs create mode 100644 test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.body.json create mode 100644 test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.header.txt create mode 100644 test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.body.txt create mode 100644 test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.header.txt diff --git a/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs b/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs index ab0007c..9cef10f 100644 --- a/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs +++ b/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs @@ -248,7 +248,7 @@ public async IAsyncEnumerable GetStreamingResponseAsync( Role = streamedRole }; - if (response.Output.Choices?.FirstOrDefault()?.Message.Content is { Length: > 0 }) + if (response.Output.Choices?.FirstOrDefault()?.Message.Content.ToString() is { Length: > 0 }) { update.Contents.Add(new TextContent(response.Output.Choices[0].Message.Content)); } diff --git a/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs new file mode 100644 index 0000000..c0fa679 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs @@ -0,0 +1,62 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace Cnblogs.DashScope.Core.Internals; + +internal class TextChatMessageContentConvertor : JsonConverter +{ + /// + public override TextChatMessageContent? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.String) + { + var s = reader.GetString(); + return s == null ? null : new TextChatMessageContent(s); + } + + if (reader.TokenType == JsonTokenType.StartArray) + { + var contents = JsonSerializer.Deserialize>(ref reader, options); + if (contents == null) + { + // impossible + return null; + } + + var text = contents.FirstOrDefault(x => string.IsNullOrEmpty(x.Text) == false)?.Text + ?? throw new JsonException("No text found in content array"); + var docUrls = contents.FirstOrDefault(x => x.DocUrl != null)?.DocUrl; + return new TextChatMessageContent(text, docUrls); + } + + throw new JsonException("Unknown type for TextChatMessageContent"); + } + + /// + public override void Write(Utf8JsonWriter writer, TextChatMessageContent value, JsonSerializerOptions options) + { + if (value.DocUrls != null) + { + JsonSerializer.Serialize( + writer, + new List() + { + new() { Type = "text", Text = value.Text }, + new() + { + Type = "doc_url", + DocUrl = value.DocUrls.ToList(), + FileParsingStrategy = "auto" + } + }, + options); + } + else + { + JsonSerializer.Serialize(writer, value.Text, options); + } + } +} diff --git a/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentInternal.cs b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentInternal.cs new file mode 100644 index 0000000..49c3760 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentInternal.cs @@ -0,0 +1,9 @@ +namespace Cnblogs.DashScope.Core.Internals; + +internal class TextChatMessageContentInternal +{ + public string Type { get; set; } = "text"; + public string? Text { get; set; } + public List? DocUrl { get; set; } + public string? FileParsingStrategy { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/TextChatMessage.cs b/src/Cnblogs.DashScope.Core/TextChatMessage.cs index c9301c1..1ed4d25 100644 --- a/src/Cnblogs.DashScope.Core/TextChatMessage.cs +++ b/src/Cnblogs.DashScope.Core/TextChatMessage.cs @@ -6,7 +6,7 @@ namespace Cnblogs.DashScope.Core; /// /// Represents a chat message between the user and the model. /// -public record TextChatMessage : IMessage +public record TextChatMessage : IMessage { /// /// Create chat message from an uploaded DashScope file. @@ -38,7 +38,7 @@ public TextChatMessage(IEnumerable fileIds) [JsonConstructor] public TextChatMessage( string role, - string content, + TextChatMessageContent content, string? toolCallId = null, bool? partial = null, string? reasoningContent = null, @@ -56,7 +56,7 @@ public TextChatMessage( public string Role { get; init; } /// The content of this message. - public string Content { get; init; } + public TextChatMessageContent Content { get; init; } /// Used when role is tool, represents the function name of this message generated by. public string? ToolCallId { get; init; } @@ -105,6 +105,17 @@ public static TextChatMessage File(IEnumerable fileIds) return new TextChatMessage(fileIds); } + /// + /// Create a docUrls message. + /// + /// Text input. + /// The doc urls. + /// + public static TextChatMessage DocUrl(string prompt, IEnumerable docUrls) + { + return new TextChatMessage(DashScopeRoleNames.User, new TextChatMessageContent(prompt, docUrls)); + } + /// /// Create a user message. /// diff --git a/src/Cnblogs.DashScope.Core/TextChatMessageContent.cs b/src/Cnblogs.DashScope.Core/TextChatMessageContent.cs new file mode 100644 index 0000000..0121861 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextChatMessageContent.cs @@ -0,0 +1,62 @@ +using System.Text.Json.Serialization; +using Cnblogs.DashScope.Core.Internals; + +namespace Cnblogs.DashScope.Core; + +/// +/// Content of the . +/// +[JsonConverter(typeof(TextChatMessageContentConvertor))] +public class TextChatMessageContent +{ + /// + /// The text part of the content. + /// + public string Text { get; } + + /// + /// Optional doc urls. + /// + public IEnumerable? DocUrls { get; } + + /// + /// Creates a with text content. + /// + /// The text content. + public TextChatMessageContent(string text) + { + Text = text; + DocUrls = null; + } + + /// + /// Creates a with text content and doc urls. + /// + /// The text content. + /// The doc urls. + public TextChatMessageContent(string text, IEnumerable? docUrls) + { + Text = text; + DocUrls = docUrls; + } + + /// + /// Convert string to TextChatMessageContent implicitly. + /// + /// The string value to convert. + /// + public static implicit operator TextChatMessageContent(string value) => new(value); + + /// + /// Convert to string implicitly. + /// + /// The value to convert. + /// + public static implicit operator string(TextChatMessageContent value) => value.Text; + + /// + public override string ToString() + { + return Text; + } +} diff --git a/src/Cnblogs.DashScope.Core/TextGenerationTokenUsage.cs b/src/Cnblogs.DashScope.Core/TextGenerationTokenUsage.cs index b9b2ca1..d611881 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationTokenUsage.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationTokenUsage.cs @@ -35,4 +35,9 @@ public class TextGenerationTokenUsage /// The total number of token. /// public int TotalTokens { get; set; } + + /// + /// Cached token count. + /// + public int? CachedTokens { get; set; } } diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs index 5f420a2..1d336fc 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs @@ -1,5 +1,4 @@ using Cnblogs.DashScope.Core; -using Cnblogs.DashScope.Core.Internals; using Cnblogs.DashScope.Tests.Shared.Utils; using NSubstitute; diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs new file mode 100644 index 0000000..782bba6 --- /dev/null +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs @@ -0,0 +1,97 @@ +using System.Text.Json; +using Cnblogs.DashScope.Core; +using Cnblogs.DashScope.Core.Internals; + +namespace Cnblogs.DashScope.Sdk.UnitTests; + +public class TextChatMessageContentJsonConvertorTests +{ + private const string TextJson = "\"some text\""; + + private const string DocUrlJson = + "[{\"type\":\"text\",\"text\":\"some content\"},{\"type\":\"doc_url\",\"doc_url\":[\"url1\"],\"file_parsing_strategy\":\"auto\"}]"; + + [Fact] + public void Serialize_Text_StringAsync() + { + // Arrange + var content = new TextChatMessageContent("some text"); + + // Act + var json = JsonSerializer.Serialize(content, DashScopeDefaults.SerializationOptions); + + // Assert + Assert.Equal(TextJson, json); + } + + [Fact] + public void Serialize_DocUrl_ObjectAsync() + { + // Arrange + var content = new TextChatMessageContent("some content", new[] { "url1" }); + + // Act + var json = JsonSerializer.Serialize(content, DashScopeDefaults.SerializationOptions); + + // Assert + Assert.Equal(DocUrlJson, json); + } + + [Fact] + public void Deserialize_InvalidType_ThrowAsync() + { + // Arrange + const string errJson = "{}"; + + // Act + var act = () => JsonSerializer.Deserialize( + errJson, + DashScopeDefaults.SerializationOptions); + + // Assert + Assert.Throws(act); + } + + [Fact] + public void Deserialize_InvalidArray_ThrowAsync() + { + // Arrange + const string errJson = "[{\"type\":\"doc_url\", \"doc_url\":[]}]"; + + // Act + var act = () => JsonSerializer.Deserialize( + errJson, + DashScopeDefaults.SerializationOptions); + + // Assert + Assert.Throws(act); + } + + [Fact] + public void Deserialize_Text_SetTextOnlyAsync() + { + // Act + var content = JsonSerializer.Deserialize( + TextJson, + DashScopeDefaults.SerializationOptions); + + // Assert + Assert.NotNull(content); + Assert.Equal("some text", content.Text); + Assert.Null(content.DocUrls); + } + + [Fact] + public void Deserialize_DocUrl_SetUrlsAsync() + { + // Act + var content = JsonSerializer.Deserialize( + DocUrlJson, + DashScopeDefaults.SerializationOptions); + + // Assert + Assert.NotNull(content); + Assert.Equal("some content", content.Text); + Assert.Equivalent(new[] { "url1" }, content.DocUrls); + } +} diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs index a53c654..8bfc404 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs @@ -225,7 +225,8 @@ public async Task ConversationCompletion_DeepResearchSse_SuccessAsync( public static readonly TheoryData, ModelResponse>> ConversationMessageFormatSseData = new( Snapshots.TextGeneration.MessageFormat.ConversationMessageIncremental, - Snapshots.TextGeneration.MessageFormat.ConversationMessageWithFilesIncremental); + Snapshots.TextGeneration.MessageFormat.ConversationMessageWithFilesIncremental, + Snapshots.TextGeneration.MessageFormat.ConversationMessageWithDocUrlsIncremental); public static readonly TheoryData, ModelResponse>> ConversationMessageFormatNoSseData = new( diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.body.json new file mode 100644 index 0000000..3441a7e --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.body.json @@ -0,0 +1,32 @@ +{ + "model": "qwen-doc-turbo", + "input": { + "messages": [ + { + "role": "system", + "content": "You are a helpful assistant." + }, + { + "role": "user", + "content": [ + { + "type": "text", + "text": "从这两份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))" + }, + { + "type": "doc_url", + "doc_url": [ + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/jockge/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CA.docx", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/ztwxzr/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CB.docx" + ], + "file_parsing_strategy": "auto" + } + ] + } + ] + }, + "parameters": { + "result_format": "message", + "incremental_output": true + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.header.txt new file mode 100644 index 0000000..66810f9 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/text-generation/generation HTTP/1.1 +Accept: text/event-stream +Content-Type: application/json +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 1341 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.body.txt new file mode 100644 index 0000000..33694e4 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.body.txt @@ -0,0 +1,465 @@ +id:1 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"```","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1827,"output_tokens":1,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:2 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"json","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1828,"output_tokens":2,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:3 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1829,"output_tokens":3,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:4 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"[\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1830,"output_tokens":4,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:5 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" {\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1834,"output_tokens":8,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:6 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"model\": \"PRO","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1838,"output_tokens":12,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:7 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"-100","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1842,"output_tokens":16,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:8 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\",\n \"name","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1846,"output_tokens":20,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:9 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"智能打印机","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1850,"output_tokens":24,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:10 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\",\n \"price","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1854,"output_tokens":28,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:11 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"89","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1858,"output_tokens":32,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:12 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"99\"\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1862,"output_tokens":36,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:13 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" },\n {\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1866,"output_tokens":40,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:14 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"model\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1870,"output_tokens":44,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:15 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"PRO-20","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1874,"output_tokens":48,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:16 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"0\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1878,"output_tokens":52,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:17 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"name\": \"智能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1882,"output_tokens":56,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:18 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"扫描仪\",\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1886,"output_tokens":60,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:19 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"price\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1890,"output_tokens":64,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:20 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"1299","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1894,"output_tokens":68,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:21 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"9\"\n },\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1898,"output_tokens":72,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:22 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" {\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1902,"output_tokens":76,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:23 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"model\": \"PRO","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1906,"output_tokens":80,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:24 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"-300","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1910,"output_tokens":84,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:25 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\",\n \"name","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1914,"output_tokens":88,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:26 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"智能会议","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1918,"output_tokens":92,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:27 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"系统\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1922,"output_tokens":96,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:28 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"price\": \"2","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1926,"output_tokens":100,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:29 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"5999","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1930,"output_tokens":104,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:30 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\"\n },\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1934,"output_tokens":108,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:31 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" {\n \"model","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1938,"output_tokens":112,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:32 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"PRO-","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1942,"output_tokens":116,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:33 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"400\",\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1946,"output_tokens":120,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:34 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"name\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1950,"output_tokens":124,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:35 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"智能考勤","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1954,"output_tokens":128,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:36 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"机\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1958,"output_tokens":132,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:37 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"price\": \"6","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1962,"output_tokens":136,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:38 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"999\"\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1966,"output_tokens":140,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:39 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" },\n {\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1970,"output_tokens":144,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:40 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"model\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1974,"output_tokens":148,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:41 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"PRO-5","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1978,"output_tokens":152,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:42 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"00\",\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1982,"output_tokens":156,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:43 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"name\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1986,"output_tokens":160,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:44 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"智能文件柜\",\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1990,"output_tokens":164,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:45 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"price\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1994,"output_tokens":168,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:46 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"159","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1998,"output_tokens":172,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:47 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"99\"\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2002,"output_tokens":176,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:48 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" },\n {\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2006,"output_tokens":180,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:49 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"model\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2010,"output_tokens":184,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:50 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"SEC-10","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2014,"output_tokens":188,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:51 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"0\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2018,"output_tokens":192,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:52 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"name\": \"智能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2022,"output_tokens":196,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:53 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"监控摄像头\",\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2026,"output_tokens":200,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:54 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"price\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2030,"output_tokens":204,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:55 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"3999","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2034,"output_tokens":208,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:56 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\"\n },\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2038,"output_tokens":212,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:57 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" {\n \"model","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2042,"output_tokens":216,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:58 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"SEC-","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2046,"output_tokens":220,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:59 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"200\",\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2050,"output_tokens":224,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:60 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"name\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2054,"output_tokens":228,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:61 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"智能门禁","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2058,"output_tokens":232,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:62 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"系统\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2062,"output_tokens":236,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:63 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"price\": \"1","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2066,"output_tokens":240,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:64 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"5999","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2070,"output_tokens":244,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:65 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\"\n },\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2074,"output_tokens":248,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:66 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" {\n \"model","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2078,"output_tokens":252,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:67 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"SEC-","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2082,"output_tokens":256,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:68 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"300\",\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2086,"output_tokens":260,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:69 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"name\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2090,"output_tokens":264,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:70 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"智能报警系统","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2094,"output_tokens":268,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:71 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\",\n \"price","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2098,"output_tokens":272,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:72 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"28","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2102,"output_tokens":276,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:73 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"999\"\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2106,"output_tokens":280,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:74 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" },\n {\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2110,"output_tokens":284,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:75 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"model\":","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2114,"output_tokens":288,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:76 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"SEC-4","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2118,"output_tokens":292,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:77 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"00\",\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2122,"output_tokens":296,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:78 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"name\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2126,"output_tokens":300,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:79 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"智能访客系统","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2130,"output_tokens":304,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:80 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\",\n \"price","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2134,"output_tokens":308,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:81 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"\": \"99","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2138,"output_tokens":312,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:82 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"99\"\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2142,"output_tokens":316,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:83 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" },\n {\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2146,"output_tokens":320,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:84 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"model\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2150,"output_tokens":324,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:85 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"SEC-50","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2154,"output_tokens":328,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:86 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"0\",\n \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2158,"output_tokens":332,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:87 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"name\": \"智能","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2162,"output_tokens":336,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:88 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"停车管理\",\n ","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2166,"output_tokens":340,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:89 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":" \"price\": \"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2170,"output_tokens":344,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:90 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"2299","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2174,"output_tokens":348,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:91 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"9\"\n }\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2178,"output_tokens":352,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:92 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"]\n```","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":2180,"output_tokens":354,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + +id:93 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":2180,"output_tokens":354,"input_tokens":1826,"cached_tokens":0},"request_id":"ee1a01a9-4c9e-4729-ae35-f5948124b302"} + diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.header.txt new file mode 100644 index 0000000..acdf959 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/conversation-generation-message-with-doc-url-sse.response.header.txt @@ -0,0 +1,27 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers +x-request-id: ee1a01a9-4c9e-4729-ae35-f5948124b302 +content-type: text/event-stream;charset=UTF-8 +x-dashscope-call-gateway: true +x-dashscope-timeout: 298 +x-dashscope-apikeyid: 67516 +x-dashscope-inner-streammode: OUT +x-dashscope-inner-requestreadytime: 1764518201003 +x-dashscope-inner-gateway-datainspection: {"input":"disable","output":"disable","bach_characters":15,"gateway_check":true} +x-dashscope-inner-model-type: BASE_MODEL +x-dashscope-uid: 1493478651020171 +x-dashscope-inner-enableestimatedusage: true +x-dashscope-requestid: ee1a01a9-4c9e-4729-ae35-f5948124b302 +x-dashscope-inner-request-priority: 10 +x-dashscope-apikeyloc: header +x-dashscope-inner-flow-control: verified +x-dashscope-inner-logging-policy: default +x-dashscope-inner-timeout: 298 +x-dashscope-finished: false +req-cost-time: 820 +req-arrive-time: 1764518200992 +resp-start-time: 1764518201812 +x-envoy-upstream-service-time: 812 +date: Sun, 30 Nov 2025 15:56:41 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 c523850..af7698d 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs @@ -341,8 +341,9 @@ public static readonly { FinishReason = "stop", Index = 1, - Message = TextChatMessage.Assistant( - "行吧,不过这东西有点复杂哦~你要先了解基本的数据结构和平衡树的概念才行。。。你想不想听我说说看啊?") + Message = + TextChatMessage.Assistant( + "行吧,不过这东西有点复杂哦~你要先了解基本的数据结构和平衡树的概念才行。。。你想不想听我说说看啊?") } } }, @@ -1123,6 +1124,56 @@ public static readonly InputTokens = 58 } }); + + public static readonly RequestSnapshot, + ModelResponse> + ConversationMessageWithDocUrlsIncremental = new( + "conversation-generation-message-with-doc-url", + new ModelRequest() + { + Model = "qwen-doc-turbo", + Input = new TextGenerationInput() + { + Messages = new List() + { + TextChatMessage.System("You are a helpful assistant."), + TextChatMessage.DocUrl( + "从这两份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))", + new[] + { + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/jockge/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CA.docx", + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251107/ztwxzr/%E7%A4%BA%E4%BE%8B%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8CB.docx" + }) + } + }, + Parameters = new TextGenerationParameters() + { + ResultFormat = "message", IncrementalOutput = true + } + }, + new ModelResponse() + { + RequestId = "ee1a01a9-4c9e-4729-ae35-f5948124b302", + Output = new TextGenerationOutput() + { + Choices = new List() + { + new() + { + FinishReason = "stop", + Message = TextChatMessage.Assistant( + "```json\n[\n {\n \"model\": \"PRO-100\",\n \"name\": \"智能打印机\",\n \"price\": \"8999\"\n },\n {\n \"model\": \"PRO-200\",\n \"name\": \"智能扫描仪\",\n \"price\": \"12999\"\n },\n {\n \"model\": \"PRO-300\",\n \"name\": \"智能会议系统\",\n \"price\": \"25999\"\n },\n {\n \"model\": \"PRO-400\",\n \"name\": \"智能考勤机\",\n \"price\": \"6999\"\n },\n {\n \"model\": \"PRO-500\",\n \"name\": \"智能文件柜\",\n \"price\": \"15999\"\n },\n {\n \"model\": \"SEC-100\",\n \"name\": \"智能监控摄像头\",\n \"price\": \"3999\"\n },\n {\n \"model\": \"SEC-200\",\n \"name\": \"智能门禁系统\",\n \"price\": \"15999\"\n },\n {\n \"model\": \"SEC-300\",\n \"name\": \"智能报警系统\",\n \"price\": \"28999\"\n },\n {\n \"model\": \"SEC-400\",\n \"name\": \"智能访客系统\",\n \"price\": \"9999\"\n },\n {\n \"model\": \"SEC-500\",\n \"name\": \"智能停车管理\",\n \"price\": \"22999\"\n }\n]\n```") + } + } + }, + Usage = new TextGenerationTokenUsage() + { + TotalTokens = 2180, + OutputTokens = 354, + InputTokens = 1826, + CachedTokens = 0 + } + }); } } } diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs index 7e22bf6..6bcb43d 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs @@ -135,6 +135,7 @@ public static readonly public static class Upload { + // get-upload-policy.response.body.txt must be CRLF public static readonly RequestSnapshot GetPolicyNoSse = new( "get-upload-policy", new DashScopeTemporaryUploadPolicy( @@ -151,6 +152,7 @@ public static class Upload "private", "true"))); + // upload-temporary-file.request.body.txt must be CRLF public static readonly RequestSnapshot UploadTemporaryFileNoSse = new("upload-temporary-file") { Boundary = "5aa22a67-eae4-4c54-8f62-c486fefd11a5"