diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0af6bf5..6ec5b94 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,20 +4,19 @@ on: push: branches: [ "main" ] pull_request: - branches: [ "main" ] + branches: [ "main", "staging" ] jobs: test-net6: runs-on: ubuntu-latest container: mcr.microsoft.com/dotnet/sdk:6.0 - steps: - name: Checkout uses: actions/checkout@v4 - name: Build - run: dotnet build src/Cnblogs.DashScope.AspNetCore -c Release + run: dotnet build src/Cnblogs.DashScope.AspNetCore -c Release -p:TargetFrameworks=net6.0 - name: Test - run: dotnet test test/Cnblogs.DashScope.Sdk.UnitTests -c Release + run: dotnet test test/Cnblogs.DashScope.Sdk.UnitTests -c Release -p:TargetFrameworks=net6.0 test-net8: runs-on: ubuntu-latest container: mcr.microsoft.com/dotnet/sdk:8.0 @@ -25,7 +24,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - name: Build - run: dotnet build src/Cnblogs.DashScope.AI -c Release + run: dotnet build src/Cnblogs.DashScope.AI -c Release -p:TargetFrameworks=net8.0 - name: Test - run: dotnet test test/Cnblogs.DashScope.AI.UnitTests -c Release + run: dotnet test test/Cnblogs.DashScope.AI.UnitTests -c Release -p:TargetFrameworks=net8.0 && dotnet test test/Cnblogs.DashScope.Sdk.UnitTests -c Release -p:TargetFrameworks=net8.0 diff --git a/Directory.Build.props b/Directory.Build.props index 3eaabd9..c98ba0c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - net6.0 + net6.0;net8.0 enable enable Cnblogs diff --git a/README.md b/README.md index f6cd6de..9fdcbcb 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,6 @@ A non-official DashScope (Bailian) service SDK maintained by Cnblogs. ## Quick Start -### Using `Microsoft.Extensions.AI` Interface - -Install NuGet package `Cnblogs.DashScope.AI` -```csharp -var client = new DashScopeClient("your-api-key").AsChatClient("qwen-max"); -var completion = await client.CompleteAsync("hello"); -Console.WriteLine(completion) -``` - ### Console Application Install NuGet package `Cnblogs.DashScope.Sdk` @@ -90,7 +81,93 @@ public class YourService(IDashScopeClient client) } } ``` +### Using `Microsoft.Extensions.AI` Interface + +Install NuGet package `Cnblogs.DashScope.AI` + +```csharp +var client = new DashScopeClient("your-api-key").AsChatClient("qwen-max"); +var completion = await client.GetResponseAsync("hello"); +Console.WriteLine(completion.Text); +``` + +#### Fallback to raw messages + +If you need to use input data or parameters not supported by `Microsoft.Extensions.AI`, you can directly invoke the underlying SDK by passing a raw `TextChatMessage` or `MultimodalMessage` via `RawPresentation`. + +Similarly, to pass unsupported parameters, you can also do so directly by setting the `raw` property within `AdditionalProperties`. + +Example(Using `qwen-doc-turbo`) + +```csharp +var messages = new List() +{ + TextChatMessage.DocUrl( + "从这两份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))", + [ + "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" + ]) +}; +var parameters = new TextGenerationParameters() +{ + ResultFormat = "message", IncrementalOutput = true, +}; + +var response = client + .AsChatClient("qwen-doc-turbo") + .GetStreamingResponseAsync( + messages.Select(x => new ChatMessage() { RawRepresentation = x }), + new ChatOptions() + { + AdditionalProperties = new AdditionalPropertiesDictionary() { { "raw", parameters } } + }); +await foreach (var chunk in response) +{ + Console.Write(chunk.Text); +} +``` + +Similarly, you can also retrieve the raw message from the `RawPresentation` in the message returned by the model. + +Example (Getting the token count for an image when calling `qwen3-vl-plus`): + +```csharp +var response = client + .AsChatClient("qwen3-vl-plus") + .GetStreamingResponseAsync( + new List() + { + new( + ChatRole.User, + new List() + { + new UriContent( + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg", + MediaTypeNames.Image.Jpeg), + new UriContent( + "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png", + MediaTypeNames.Image.Jpeg), + new TextContent("这些图展现了什么内容?") + }) + }, + new ChatOptions()); +var lastChunk = (ChatResponseUpdate?)null; +await foreach (var chunk in response) +{ + Console.Write(chunk.Text); + lastChunk = chunk; +} + +Console.WriteLine(); + +// Access underlying raw response +var raw = lastChunk?.RawRepresentation as ModelResponse; +Console.WriteLine($"Image token usage: {raw?.Usage?.ImageTokens}"); +``` + ## Supported APIs + - [Text Generation](#text-generation) - QWen3, DeepSeek, etc. Supports reasoning/tool calling/web search/translation scenarios - [Conversation](#conversation) - [Thinking Models](#thinking-models) @@ -98,6 +175,7 @@ public class YourService(IDashScopeClient client) - [Tool Calling](#tool-calling) - [Prefix Completion](#prefix-completion) - [Long Context (Qwen-Long)](#long-context-qwen-long) + - [Code Interpreter](#code-interpreter) - [Multimodal](#multimodal) - QWen-VL, QVQ, etc. Supports reasoning/visual understanding/OCR/audio understanding - [Upload file for multimodal usage](#upload-file-for-multimodal-usage) - [Image Recognition/Thinking](#image-recognition/thinking) @@ -109,7 +187,8 @@ public class YourService(IDashScopeClient client) - [Formula Recognition](#formula-recognition) - [Text Recognition](#text-recognition) - [Multilanguage](#multilanguage) - + - [GUI](#gui) + - [Audio Understanding](#audio-understanding) - [Text-to-Speech](#text-to-speech) - CosyVoice, Sambert, etc. For TTS applications - [Image Generation](#image-generation) - wanx2.1, etc. For text-to-image and portrait style transfer - [Application Call](#application-call) @@ -499,7 +578,7 @@ new ModelRequest() For Qwen-Long models: ```csharp var file = new FileInfo("test.txt"); -var uploadedFile = await dashScopeClient.UploadFileAsync(file.OpenRead(), file.Name); +var uploadedFile = await dashScopeClient.OpenAiCompatibleUploadFileAsync(file.OpenRead(), file.Name); var history = new List { ChatMessage.File(uploadedFile.Id) }; var completion = await client.client.GetTextCompletionAsync( new ModelRequest() @@ -514,10 +593,121 @@ var completion = await client.client.GetTextCompletionAsync( }); Console.WriteLine(completion.Output.Choices[0].Message.Content); // Cleanup -await dashScopeClient.DeleteFileAsync(uploadedFile.Id); +await dashScopeClient.OpenAiCompatibleDeleteFileAsync(uploadedFile.Id); +``` + +### Code Interpreter + +**This capability is mutually exclusive with Function Call and cannot be used simultaneously.** + +Use the `EnableCodeInterpreter` parameter in `Parameters` to allow the model to write code and call an internal code interpreter for calculations. + +Example Request: + +```csharp +var completion = client.GetTextCompletionStreamAsync( + new ModelRequest() + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput() { Messages = messages }, + Parameters = new TextGenerationParameters() + { + ResultFormat = "message", + EnableThinking = true, + EnableCodeInterpreter = true, + IncrementalOutput = true + } + }); ``` +The code that model generated will be included in `chunk.Output.ToolInfo.CodeInterpreter`. The invocation process can be considered part of the reasoning process. + +Full example, + +```csharp +var messages = new List(); +const string input = "123的21次方是多少?"; +Console.Write($"User > {input}"); +messages.Add(TextChatMessage.User(input)); +var completion = client.GetTextCompletionStreamAsync( + new ModelRequest + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput { Messages = messages }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + EnableThinking = true, + EnableCodeInterpreter = true, + IncrementalOutput = true + } + }); +var reply = new StringBuilder(); +var codeGenerated = false; +var reasoning = false; +TextGenerationTokenUsage? usage = null; +await foreach (var chunk in completion) +{ + var choice = chunk.Output.Choices![0]; + var tool = chunk.Output.ToolInfo?.FirstOrDefault(); + if (codeGenerated == false && tool?.CodeInterpreter != null) + { + Console.WriteLine($"Code > {tool.CodeInterpreter.Code}"); + codeGenerated = true; + } + + if (string.IsNullOrEmpty(choice.Message.ReasoningContent) == false) + { + // reasoning + if (reasoning == false) + { + Console.WriteLine(); + Console.Write("Reasoning > "); + reasoning = true; + } + + Console.Write(choice.Message.ReasoningContent); + continue; + } + + if (reasoning && string.IsNullOrEmpty(choice.Message.Content.Text) == false) + { + reasoning = false; + Console.WriteLine(); + Console.Write("Assistant > "); + } + + Console.Write(choice.Message.Content); + reply.Append(choice.Message.Content); + usage = chunk.Usage; +} + +Console.WriteLine(); +messages.Add(TextChatMessage.Assistant(reply.ToString())); +if (usage != null) +{ + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/reasoning({usage.OutputTokensDetails?.ReasoningTokens})/plugins({usage.Plugins?.CodeInterpreter?.Count})/total({usage.TotalTokens})"); +} + +/* +User > 123的21次方是多少? +Reasoning > 用户问的是123的21次方是多少。这是一个大数计算问题,我需要使用代码计算器来计算这个值。 + +我需要调用code_interpreter函数,传入计算123**21的Python代码。 +123**21 +用户询问123的21次方是多少,我使用代码计算器计算出了结果。结果是一个非常大的数字:77269364466549865653073473388030061522211723 + +我应该直接给出这个结果,因为这是一个精确的数学计算问题,不需要额外的解释或 +Assistant > 123的21次方是:77269364466549865653073473388030061522211723 +Usage: in(704)/out(234)/reasoning(142)/plugins(1)/total(938) +*/ +``` + + + ## Multimodal + Use `GetMultimodalGenerationAsync`/`GetMultimodalGenerationStreamAsync` [Official Documentation](https://help.aliyun.com/zh/model-studio/multimodal) @@ -1442,6 +1632,77 @@ Response: Then you can execute the command that model returns, and reply the screenshot with next intension. +### Audio Understanding + +Example(use `Qwen3-Omni-Captioner`) + +```csharp +// upload file +await using var audio = File.OpenRead("noise.wav"); +var ossLink = await client.UploadTemporaryFileAsync("qwen3-omni-30b-a3b-captioner", audio, "noise.wav"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = new List +{ + MultimodalMessage.User( + [ + // 也可以直接传入公网地址 + MultimodalMessageContent.AudioContent(ossLink), + ]) +}; +var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen3-omni-30b-a3b-captioner", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() { IncrementalOutput = true, } + }); +var reply = new StringBuilder(); +var first = true; +MultimodalTokenUsage? usage = null; +await foreach (var chunk in completion) +{ + var choice = chunk.Output.Choices[0]; + if (first) + { + first = false; + Console.WriteLine(); + Console.Write("Assistant > "); + } + + if (choice.Message.Content.Count == 0) + { + continue; + } + + Console.Write(choice.Message.Content[0].Text); + reply.Append(choice.Message.Content[0].Text); + usage = chunk.Usage; +} + +Console.WriteLine(); +messages.Add(MultimodalMessage.Assistant([MultimodalMessageContent.TextContent(reply.ToString())])); +if (usage != null) +{ + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/audio({usage.InputTokensDetails?.AudioTokens})/total({usage.TotalTokens})"); +} +``` + +Sample output + +```csharp +Assistant > The audio clip opens with a rapid, percussive metallic clatter, reminiscent of a typewriter or similar mechanical device, which continues in a steady rhythm throughout the recording. This clatter is slightly left-of-center in the stereo field and is accompanied by a faint, low-frequency hum, likely from a household appliance or HVAC system. The acoustic environment is a small, enclosed room with hard surfaces, indicated by the short, bright reverberation of both the clatter and the speaker’s voice. The audio quality is moderate, with a noticeable electronic hiss and some loss of high-frequency detail, but no digital distortion or clipping. + +At the one-second mark, a male voice enters, positioned slightly right-of-center and closer to the microphone. He speaks in standard Mandarin, with a tone of weary exasperation: “哎 呀,这样我还怎么安静工作啊?” (“Aiyā, zěnyàng wǒ hái zěnme ānjìng gōngzuò a?”), which translates to “Oh, how can I possibly work quietly like this?” His speech is clear, with a slightly rising pitch on “安静” (“quietly”) and a falling pitch on “啊” (“a”), conveying a sense of complaint and fatigue. The accent is standard, with no regional inflection, and the voice is that of a young to middle-aged adult male. + +Throughout the clip, the mechanical clatter remains constant and prominent, occasionally competing with the voice for clarity. There are no other sounds, such as footsteps, additional voices, or environmental noises, and the background is otherwise quiet. The interplay between the persistent mechanical noise and the speaker’s complaint creates a vivid sense of disruption and frustration, suggesting an environment where work is being impeded by an external, uncontrolled sound source. + +Culturally, the use of Mandarin, standard pronunciation, and modern recording quality indicate a contemporary, urban Chinese setting. The language and tone are universally relatable, reflecting a common experience of being disturbed during work. The lack of regional markers or distinctive background noises suggests a generic, possibly domestic or office-like space, but with no clear indicators of a specific location or social context. + +In summary, the audio portrays a modern Mandarin-speaking man, exasperated by a constant, distracting mechanical noise (likely a typewriter or similar device), attempting to work in a small, reverberant room. The recording’s technical and acoustic features reinforce the sense of disruption and frustration, while the language and setting suggest a contemporary, urban Chinese context. +Usage: in(160)/out(514)/audio(152)/total(674) +``` + ## Text-to-Speech Create a speech synthesis session using `dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync()`. diff --git a/README.zh-Hans.md b/README.zh-Hans.md index 65b1b82..e471642 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -95,8 +95,13 @@ public class YourService(IDashScopeClient client) - [深度思考](#深度思考) - [联网搜索](#联网搜索) - [工具调用](#工具调用) + - [代码解释器](#代码解释器) - [前缀续写](#前缀续写) - [长上下文(Qwen-Long)](#长上下文(Qwen-Long)) + - [翻译能力(Qwen-MT)](#翻译能力(Qwen-MT)) + - [角色扮演(Qwen-Character)](#角色扮演(Qwen-Character)) + - [数据挖掘(Qwen-doc-turbo)](#数据挖掘(Qwen-doc-turbo)) + - [深入研究(Qwen-Deep-Research)](#深入研究(Qwen-Deep-Research)) - [多模态](#多模态) - QWen-VL,QVQ 等,支持推理/视觉理解/OCR/音频理解等场景 - [视觉理解/推理](#视觉理解/推理) - 图像/视频输入与理解,支持推理模式 - [文字提取](#文字提取) - OCR 任务,读取表格/文档/公式等 @@ -1008,6 +1013,112 @@ Usage: in(302)/out(19)/total(321) */ ``` +### 代码解释器 + +**该能力与 Function call 互斥,无法同时使用。** + +通过 `Parameters` 里的 `EnableCodeInterpreter` 允许模型编写代码并调用内部代码解释器来进行计算。 + +示例请求: + +```csharp +var completion = client.GetTextCompletionStreamAsync( + new ModelRequest() + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput() { Messages = messages }, + Parameters = new TextGenerationParameters() + { + ResultFormat = "message", + EnableThinking = true, + EnableCodeInterpreter = true, + IncrementalOutput = true + } + }); +``` + +完整示例,大模型生成的代码将被包含在 `chunk.Output.ToolInfo.CodeInterpreter` 里,调用过程可以视为思考过程的一部分。 + +```csharp +var messages = new List(); +const string input = "123的21次方是多少?"; +Console.Write($"User > {input}"); +messages.Add(TextChatMessage.User(input)); +var completion = client.GetTextCompletionStreamAsync( + new ModelRequest + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput { Messages = messages }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + EnableThinking = true, + EnableCodeInterpreter = true, + IncrementalOutput = true + } + }); +var reply = new StringBuilder(); +var codeGenerated = false; +var reasoning = false; +TextGenerationTokenUsage? usage = null; +await foreach (var chunk in completion) +{ + var choice = chunk.Output.Choices![0]; + var tool = chunk.Output.ToolInfo?.FirstOrDefault(); + if (codeGenerated == false && tool?.CodeInterpreter != null) + { + Console.WriteLine($"Code > {tool.CodeInterpreter.Code}"); + codeGenerated = true; + } + + if (string.IsNullOrEmpty(choice.Message.ReasoningContent) == false) + { + // reasoning + if (reasoning == false) + { + Console.WriteLine(); + Console.Write("Reasoning > "); + reasoning = true; + } + + Console.Write(choice.Message.ReasoningContent); + continue; + } + + if (reasoning && string.IsNullOrEmpty(choice.Message.Content.Text) == false) + { + reasoning = false; + Console.WriteLine(); + Console.Write("Assistant > "); + } + + Console.Write(choice.Message.Content); + reply.Append(choice.Message.Content); + usage = chunk.Usage; +} + +Console.WriteLine(); +messages.Add(TextChatMessage.Assistant(reply.ToString())); +if (usage != null) +{ + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/reasoning({usage.OutputTokensDetails?.ReasoningTokens})/plugins({usage.Plugins?.CodeInterpreter?.Count})/total({usage.TotalTokens})"); +} + +/* +User > 123的21次方是多少? +Reasoning > 用户问的是123的21次方是多少。这是一个大数计算问题,我需要使用代码计算器来计算这个值。 + +我需要调用code_interpreter函数,传入计算123**21的Python代码。 +123**21 +用户询问123的21次方是多少,我使用代码计算器计算出了结果。结果是一个非常大的数字:77269364466549865653073473388030061522211723 + +我应该直接给出这个结果,因为这是一个精确的数学计算问题,不需要额外的解释或 +Assistant > 123的21次方是:77269364466549865653073473388030061522211723 +Usage: in(704)/out(234)/reasoning(142)/plugins(1)/total(938) +*/ +``` + ### 结构化输出(JSON 输出) 设置 `Parameter` 里的 `ResponseFormat` (注意不是 `ResultFormat` )为 JSON 即可强制大模型以 JSON 格式输出。 diff --git a/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj b/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj index b75cd98..1929eb1 100644 --- a/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj +++ b/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net8.0 enable enable false @@ -50,6 +50,9 @@ Always + + PreserveNewest + diff --git a/sample/Cnblogs.DashScope.Sample/Files/FileUploadSample.cs b/sample/Cnblogs.DashScope.Sample/Files/FileUploadSample.cs new file mode 100644 index 0000000..7ded2de --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Files/FileUploadSample.cs @@ -0,0 +1,37 @@ +using System.Text.Json; +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Files; + +public class FileUploadSample : FilesSample +{ + /// + public override string Description => "Upload File Sample"; + + /// + public override async Task RunAsync(IDashScopeClient client) + { + var json = new JsonSerializerOptions(JsonSerializerDefaults.Web) { WriteIndented = true }; + var file = new FileInfo("Lenna.jpg"); + Console.WriteLine("Uploading file..."); + var response = await client.UploadFilesAsync( + "file-extract", + [new DashScopeUploadFileInput(file.OpenRead(), file.Name, "Lenna")]); + Console.WriteLine($"File uploaded, fileId: {response.Data.UploadedFiles[0].FileId}"); + + await Task.Delay(1000); + Console.WriteLine("Get file info..."); + var fileInfo = await client.GetFileAsync(response.Data.UploadedFiles[0].FileId); + Console.WriteLine(JsonSerializer.Serialize(fileInfo.Data, json)); + + await Task.Delay(1000); + Console.WriteLine("List files..."); + var list = await client.ListFilesAsync(1, 2); + Console.WriteLine(JsonSerializer.Serialize(list.Data.Files, json)); + + await Task.Delay(1000); + Console.Write("Delete file..."); + await client.DeleteFileAsync(response.Data.UploadedFiles[0].FileId); + Console.WriteLine("Success"); + } +} diff --git a/sample/Cnblogs.DashScope.Sample/FilesSample.cs b/sample/Cnblogs.DashScope.Sample/FilesSample.cs new file mode 100644 index 0000000..c7aa556 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/FilesSample.cs @@ -0,0 +1,15 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample; + +public abstract class FilesSample : ISample +{ + /// + public string Group => "Files"; + + /// + public abstract string Description { get; } + + /// + public abstract Task RunAsync(IDashScopeClient client); +} diff --git a/sample/Cnblogs.DashScope.Sample/ISample.cs b/sample/Cnblogs.DashScope.Sample/ISample.cs index eb5c50e..3692b47 100644 --- a/sample/Cnblogs.DashScope.Sample/ISample.cs +++ b/sample/Cnblogs.DashScope.Sample/ISample.cs @@ -4,6 +4,7 @@ namespace Cnblogs.DashScope.Sample; public interface ISample { + string Group { get; } string Description { get; } Task RunAsync(IDashScopeClient client); } diff --git a/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawInputExample.cs b/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawInputExample.cs new file mode 100644 index 0000000..67ee947 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawInputExample.cs @@ -0,0 +1,98 @@ +using Cnblogs.DashScope.Core; +using Microsoft.Extensions.AI; + +namespace Cnblogs.DashScope.Sample.MsExtensionsAI; + +public class RawInputExample : MsExtensionsAiSample +{ + /// + public override string Description => "Chat with raw message and parameter input"; + + /// + public override async Task RunAsync(IDashScopeClient client) + { + var messages = new List() + { + TextChatMessage.DocUrl( + "从这两份产品手册中,提取所有产品信息,并整理成一个标准的JSON数组。每个对象需要包含:model(产品的型号)、name(产品的名称)、price(价格(去除货币符号和逗号))", + [ + "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" + ]) + }; + var parameters = new TextGenerationParameters() + { + ResultFormat = "message", IncrementalOutput = true, + }; + + var response = client + .AsChatClient("qwen-doc-turbo") + .GetStreamingResponseAsync( + messages.Select(x => new ChatMessage() { RawRepresentation = x }), + new ChatOptions() + { + AdditionalProperties = new AdditionalPropertiesDictionary() { { "raw", parameters } } + }); + await foreach (var chunk in response) + { + Console.Write(chunk.Text); + } + } +} + +/* +```json +[ + { + "model": "PRO-100", + "name": "智能打印机", + "price": "8999" + }, + { + "model": "PRO-200", + "name": "智能扫描仪", + "price": "12999" + }, + { + "model": "PRO-300", + "name": "智能会议系统", + "price": "25999" + }, + { + "model": "PRO-400", + "name": "智能考勤机", + "price": "6999" + }, + { + "model": "PRO-500", + "name": "智能文件柜", + "price": "15999" + }, + { + "model": "SEC-100", + "name": "智能监控摄像头", + "price": "3999" + }, + { + "model": "SEC-200", + "name": "智能门禁系统", + "price": "15999" + }, + { + "model": "SEC-300", + "name": "智能报警系统", + "price": "28999" + }, + { + "model": "SEC-400", + "name": "智能访客系统", + "price": "9999" + }, + { + "model": "SEC-500", + "name": "智能停车管理", + "price": "22999" + } +] +``` + */ diff --git a/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawOutputExample.cs b/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawOutputExample.cs new file mode 100644 index 0000000..56eb013 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/MsExtensionsAI/RawOutputExample.cs @@ -0,0 +1,60 @@ +using System.Net.Mime; +using Cnblogs.DashScope.Core; +using Microsoft.Extensions.AI; + +namespace Cnblogs.DashScope.Sample.MsExtensionsAI; + +public class RawOutputExample : MsExtensionsAiSample +{ + /// + public override string Description => "Chat with extra data from raw output"; + + /// + public override async Task RunAsync(IDashScopeClient client) + { + var response = client + .AsChatClient("qwen3-vl-plus") + .GetStreamingResponseAsync( + new List() + { + new( + ChatRole.User, + new List() + { + new UriContent( + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg", + MediaTypeNames.Image.Jpeg), + new UriContent( + "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png", + MediaTypeNames.Image.Png), + new TextContent("这些图展现了什么内容?") + }) + }, + new ChatOptions()); + var lastChunk = (ChatResponseUpdate?)null; + await foreach (var chunk in response) + { + Console.Write(chunk.Text); + lastChunk = chunk; + } + + Console.WriteLine(); + var raw = lastChunk?.RawRepresentation as ModelResponse; + Console.WriteLine($"Image token usage: {raw?.Usage?.ImageTokens}"); + } +} + +/* +这两张图片展现了截然不同的主题和氛围: + +- **第一张图片**:描绘了一幅温馨、宁静的场景。一位年轻女子坐在沙滩上,与一只金毛犬互动。狗狗抬起前爪,似乎在与女子“击掌”,女子面带微笑,享受着与宠物共度的美好时光。背景是波光粼粼的大海和柔和的日落光线,整个画面充满了温暖、快乐和人与动物之间亲密无间的情感。 + +- **第二张图片**:展现了一只威严的老虎在森林中行走的画面。老虎正视镜头,眼神锐利,姿态充满力量感,仿佛正在巡视自己的领地。周围是茂密的树林、覆盖苔藓的树根和散落的落叶,营造出一种原始、神秘且略带危险的自然野性氛围。 + +总的来说,这两张图分别代表了: +- **人与宠物的温情陪伴**(第一张) +- **野生动物的原始力量与自然之美**(第二张) + +它们形成了鲜明对比:一张是温柔的人类情感,另一张是野性的自然力量。 +Image token usage: 3529 + */ diff --git a/sample/Cnblogs.DashScope.Sample/MsExtensionsAiSample.cs b/sample/Cnblogs.DashScope.Sample/MsExtensionsAiSample.cs new file mode 100644 index 0000000..536b26d --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/MsExtensionsAiSample.cs @@ -0,0 +1,15 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample; + +public abstract class MsExtensionsAiSample : ISample +{ + /// + public string Group => "Microsoft.Extensions.AI"; + + /// + public abstract string Description { get; } + + /// + public abstract Task RunAsync(IDashScopeClient client); +} diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/AudioUnderstanding.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/AudioUnderstanding.cs new file mode 100644 index 0000000..a8ee12b --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/AudioUnderstanding.cs @@ -0,0 +1,79 @@ +using System.Text; +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class AudioUnderstanding : MultimodalSample +{ + /// + public override string Description => "Audio Understanding Sample"; + + /// + public override async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var audio = File.OpenRead("noise.wav"); + var ossLink = await client.UploadTemporaryFileAsync("qwen3-omni-30b-a3b-captioner", audio, "noise.wav"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = new List + { + MultimodalMessage.User( + [ + // 也可以直接传入公网地址 + MultimodalMessageContent.AudioContent(ossLink), + ]) + }; + var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen3-omni-30b-a3b-captioner", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() { IncrementalOutput = true, } + }); + var reply = new StringBuilder(); + var first = true; + MultimodalTokenUsage? usage = null; + await foreach (var chunk in completion) + { + var choice = chunk.Output.Choices[0]; + if (first) + { + first = false; + Console.WriteLine(); + Console.Write("Assistant > "); + } + + if (choice.Message.Content.Count == 0) + { + continue; + } + + Console.Write(choice.Message.Content[0].Text); + reply.Append(choice.Message.Content[0].Text); + usage = chunk.Usage; + } + + Console.WriteLine(); + messages.Add(MultimodalMessage.Assistant([MultimodalMessageContent.TextContent(reply.ToString())])); + if (usage != null) + { + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/audio({usage.InputTokensDetails?.AudioTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-12-01/f33b0b0e-7314-4ffd-b459-f418eb1e0866/sample.mp4 + +Assistant > The audio clip opens with a rapid, percussive metallic clatter, reminiscent of a typewriter or similar mechanical device, which continues in a steady rhythm throughout the recording. This clatter is slightly left-of-center in the stereo field and is accompanied by a faint, low-frequency hum, likely from a household appliance or HVAC system. The acoustic environment is a small, enclosed room with hard surfaces, indicated by the short, bright reverberation of both the clatter and the speaker’s voice. The audio quality is moderate, with a noticeable electronic hiss and some loss of high-frequency detail, but no digital distortion or clipping. + +At the one-second mark, a male voice enters, positioned slightly right-of-center and closer to the microphone. He speaks in standard Mandarin, with a tone of weary exasperation: “哎 呀,这样我还怎么安静工作啊?” (“Aiyā, zěnyàng wǒ hái zěnme ānjìng gōngzuò a?”), which translates to “Oh, how can I possibly work quietly like this?” His speech is clear, with a slightly rising pitch on “安静” (“quietly”) and a falling pitch on “啊” (“a”), conveying a sense of complaint and fatigue. The accent is standard, with no regional inflection, and the voice is that of a young to middle-aged adult male. + +Throughout the clip, the mechanical clatter remains constant and prominent, occasionally competing with the voice for clarity. There are no other sounds, such as footsteps, additional voices, or environmental noises, and the background is otherwise quiet. The interplay between the persistent mechanical noise and the speaker’s complaint creates a vivid sense of disruption and frustration, suggesting an environment where work is being impeded by an external, uncontrolled sound source. + +Culturally, the use of Mandarin, standard pronunciation, and modern recording quality indicate a contemporary, urban Chinese setting. The language and tone are universally relatable, reflecting a common experience of being disturbed during work. The lack of regional markers or distinctive background noises suggests a generic, possibly domestic or office-like space, but with no clear indicators of a specific location or social context. + +In summary, the audio portrays a modern Mandarin-speaking man, exasperated by a constant, distracting mechanical noise (likely a typewriter or similar device), attempting to work in a small, reverberant room. The recording’s technical and acoustic features reinforce the sense of disruption and frustration, while the language and setting suggest a contemporary, urban Chinese context. +Usage: in(160)/out(514)/audio(152)/total(674) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/GuiSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/GuiSample.cs index ed017ec..5a4c385 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/GuiSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/GuiSample.cs @@ -3,7 +3,7 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class GuiSample : ISample +public class GuiSample : MultimodalSample { private const string SystemPrompt = """ @@ -82,10 +82,10 @@ public class GuiSample : ISample """; /// - public string Description => "Gui Operation Sample"; + public override string Description => "Gui Operation Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { var messages = new List { diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/ImageInputSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/ImageInputSample.cs index b37b193..f223d17 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/ImageInputSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/ImageInputSample.cs @@ -3,23 +3,24 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class ImageInputSample : ISample +public class ImageInputSample : MultimodalSample { /// - public string Description => "Chat with image input"; + public override string Description => "Chat with image input"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { - var messages = new List(); - messages.Add( + var messages = new List + { MultimodalMessage.User( [ MultimodalMessageContent.ImageContent( "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"), MultimodalMessageContent.ImageContent("https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"), MultimodalMessageContent.TextContent("这些图展现了什么内容?") - ])); + ]) + }; var completion = client.GetMultimodalGenerationStreamAsync( new ModelRequest() { diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/ImageUploadSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/ImageUploadSample.cs index a636a0e..a98d260 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/ImageUploadSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/ImageUploadSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class ImageUploadSample : ISample +public class ImageUploadSample : MultimodalSample { /// - public string Description => "Upload image from file system"; + public override string Description => "Upload image from file system"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var lenna = File.OpenRead("Lenna.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs index 4189135..42bd1ab 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrAdvancedRecognitionSample : ISample +public class OcrAdvancedRecognitionSample : MultimodalSample { /// - public string Description => "OCR Advanced Recognition Task Sample"; + public override string Description => "OCR Advanced Recognition Task Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("webpage.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs index fde2dc1..105ac03 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrDocumentToLaTeXSample : ISample +public class OcrDocumentToLaTeXSample : MultimodalSample { /// - public string Description => "OCR parsing scanned document to LaTeX sample"; + public override string Description => "OCR parsing scanned document to LaTeX sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("scanned.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs index d1dd377..8cb86a0 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrFormulaRecognitionSample : ISample +public class OcrFormulaRecognitionSample : MultimodalSample { /// - public string Description => "OCR Math Formula Recognition Sample"; + public override string Description => "OCR Math Formula Recognition Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("math.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs index e1ab7e7..ff2e408 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs @@ -4,13 +4,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrKeyInformationExtractionSample : ISample +public class OcrKeyInformationExtractionSample : MultimodalSample { /// - public string Description => "OCR Key Information Extraction Sample"; + public override string Description => "OCR Key Information Extraction Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("receipt.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs index 0733a7f..c3ebe05 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrMultilanguageSample : ISample +public class OcrMultilanguageSample : MultimodalSample { /// - public string Description => "OCR Text Recognition(Multilanguage) Sample"; + public override string Description => "OCR Text Recognition(Multilanguage) Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("multilanguage.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs index aa06b13..921f885 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrSample : ISample +public class OcrSample : MultimodalSample { /// - public string Description => "OCR Sample with rotate enabled"; + public override string Description => "OCR Sample with rotate enabled"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var tilted = File.OpenRead("tilted.png"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs index 1650201..4b22199 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrTableParsingSample : ISample +public class OcrTableParsingSample : MultimodalSample { /// - public string Description => "OCR Table Parsing Sample"; + public override string Description => "OCR Table Parsing Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("table.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs index cc7a64a..ed8052f 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class OcrTextRecognition : ISample +public class OcrTextRecognition : MultimodalSample { /// - public string Description => "OCR Text Recognition(Chinese and English) Sample"; + public override string Description => "OCR Text Recognition(Chinese and English) Sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var file = File.OpenRead("webpage.jpg"); diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/VideoInputSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/VideoInputSample.cs index 942df81..02b3557 100644 --- a/sample/Cnblogs.DashScope.Sample/Multimodal/VideoInputSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/VideoInputSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Multimodal; -public class VideoInputSample : ISample +public class VideoInputSample : MultimodalSample { /// - public string Description => "Video input sample"; + public override string Description => "Video input sample"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { // upload file await using var video = File.OpenRead("sample.mp4"); diff --git a/sample/Cnblogs.DashScope.Sample/MultimodalSample.cs b/sample/Cnblogs.DashScope.Sample/MultimodalSample.cs new file mode 100644 index 0000000..d759251 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/MultimodalSample.cs @@ -0,0 +1,15 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample; + +public abstract class MultimodalSample : ISample +{ + /// + public string Group => "Multimodal"; + + /// + public abstract string Description { get; } + + /// + public abstract Task RunAsync(IDashScopeClient client); +} diff --git a/sample/Cnblogs.DashScope.Sample/Program.cs b/sample/Cnblogs.DashScope.Sample/Program.cs index c282f8b..33c2d5b 100644 --- a/sample/Cnblogs.DashScope.Sample/Program.cs +++ b/sample/Cnblogs.DashScope.Sample/Program.cs @@ -18,12 +18,20 @@ .Select(x => Activator.CreateInstance(x) as ISample) .Where(x => x != null) .Select(x => x!) - .ToList(); + .GroupBy(x => x.Group) + .ToDictionary(x => x.Key, x => x.ToList()); +var flatten = new List(); Console.WriteLine("Choose the sample you want to run:"); -for (var i = 0; i < samples.Count; i++) +foreach (var samplesKey in samples.Keys) { - Console.WriteLine($"{i}. {samples[i].Description}"); + Console.WriteLine(samplesKey); + var samplesInGroup = samples[samplesKey]; + foreach (var sample in samplesInGroup) + { + flatten.Add(sample); + Console.WriteLine($"{flatten.Count}. {sample.Description}"); + } } Console.WriteLine(); @@ -35,4 +43,4 @@ return; } -await samples[index].RunAsync(dashScopeClient); +await flatten[index - 1].RunAsync(dashScopeClient); diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatReasoningSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatReasoningSample.cs index d746bdd..81790c0 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatReasoningSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatReasoningSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatReasoningSample : ISample +public class ChatReasoningSample : TextSample { /// - public string Description => "Chat with reasoning content"; + public override string Description => "Chat with reasoning content"; /// - public async Task RunAsync(IDashScopeClient client) + public override async Task RunAsync(IDashScopeClient client) { var messages = new List(); messages.Add(TextChatMessage.System("You are a helpful assistant")); diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatSample.cs index 5852421..b46b84e 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatSample : ISample +public class ChatSample : TextSample { /// - public string Description => "Basic chat completion"; + public override string Description => "Basic chat completion"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List(); messages.Add(TextChatMessage.System("You are a helpful assistant")); diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatStreamSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatStreamSample.cs index 49a9f3e..704cfef 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatStreamSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatStreamSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatStreamSample : ISample +public class ChatStreamSample : TextSample { /// - public string Description => "Chat completion with stream output"; + public override string Description => "Chat completion with stream output"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List(); messages.Add(TextChatMessage.System("You are a helpful assistant")); diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatThinkingBudgetSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatThinkingBudgetSample.cs index 684395a..c1663f4 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatThinkingBudgetSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatThinkingBudgetSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatThinkingBudgetSample : ISample +public class ChatThinkingBudgetSample : TextSample { /// - public string Description => "Chat completion with thinking budget"; + public override string Description => "Chat completion with thinking budget"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { const int budget = 10; Console.WriteLine($"Set thinking budget to {budget} tokens"); diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatToolCallingSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatToolCallingSample.cs index a9382aa..434f60b 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatToolCallingSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatToolCallingSample.cs @@ -7,13 +7,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatToolCallingSample : ISample +public class ChatToolCallingSample : TextSample { /// - public string Description => "Chat with tool calling"; + public override string Description => "Chat with tool calling"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var tools = new List { diff --git a/sample/Cnblogs.DashScope.Sample/Text/ChatWebSearchSample.cs b/sample/Cnblogs.DashScope.Sample/Text/ChatWebSearchSample.cs index 5b4af4c..8587625 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/ChatWebSearchSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/ChatWebSearchSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class ChatWebSearchSample : ISample +public class ChatWebSearchSample : TextSample { /// - public string Description => "Chat with web search enabled"; + public override string Description => "Chat with web search enabled"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List(); while (true) diff --git a/sample/Cnblogs.DashScope.Sample/Text/CodeInterpreterSample.cs b/sample/Cnblogs.DashScope.Sample/Text/CodeInterpreterSample.cs new file mode 100644 index 0000000..63b0f46 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Text/CodeInterpreterSample.cs @@ -0,0 +1,92 @@ +using System.Text; +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Text; + +public class CodeInterpreterSample : TextSample +{ + /// + public override string Description => "Chat with code interpreter"; + + /// + public async override Task RunAsync(IDashScopeClient client) + { + var messages = new List(); + const string input = "123的21次方是多少?"; + Console.Write($"User > {input}"); + messages.Add(TextChatMessage.User(input)); + var completion = client.GetTextCompletionStreamAsync( + new ModelRequest + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput { Messages = messages }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + EnableThinking = true, + EnableCodeInterpreter = true, + IncrementalOutput = true + } + }); + var reply = new StringBuilder(); + var codeGenerated = false; + var reasoning = false; + TextGenerationTokenUsage? usage = null; + await foreach (var chunk in completion) + { + var choice = chunk.Output.Choices![0]; + var tool = chunk.Output.ToolInfo?.FirstOrDefault(); + if (codeGenerated == false && tool?.CodeInterpreter != null) + { + Console.WriteLine(tool.CodeInterpreter.Code); + codeGenerated = true; + } + + if (string.IsNullOrEmpty(choice.Message.ReasoningContent) == false) + { + // reasoning + if (reasoning == false) + { + Console.WriteLine(); + Console.Write("Reasoning > "); + reasoning = true; + } + + Console.Write(choice.Message.ReasoningContent); + continue; + } + + if (reasoning && string.IsNullOrEmpty(choice.Message.Content.Text) == false) + { + reasoning = false; + Console.WriteLine(); + Console.Write("Assistant > "); + } + + Console.Write(choice.Message.Content); + reply.Append(choice.Message.Content); + usage = chunk.Usage; + } + + Console.WriteLine(); + messages.Add(TextChatMessage.Assistant(reply.ToString())); + if (usage != null) + { + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/reasoning({usage.OutputTokensDetails?.ReasoningTokens})/plugins({usage.Plugins?.CodeInterpreter?.Count})/total({usage.TotalTokens})"); + } + } +} + +/* +User > 123的21次方是多少? +Reasoning > 用户问的是123的21次方是多少。这是一个大数计算问题,我需要使用代码计算器来计算这个值。 + +我需要调用code_interpreter函数,传入计算123**21的Python代码。 +Code > 123**21 +用户询问123的21次方是多少,我使用代码计算器计算出了结果。结果是一个非常大的数字:77269364466549865653073473388030061522211723 + +我应该直接给出这个结果,因为这是一个精确的数学计算问题,不需要额外的解释或 +Assistant > 123的21次方是:77269364466549865653073473388030061522211723 +Usage: in(704)/out(234)/reasoning(142)/plugins(1)/total(938) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Text/DataMiningSample.cs b/sample/Cnblogs.DashScope.Sample/Text/DataMiningSample.cs index 3dff9a5..eb846a2 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/DataMiningSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/DataMiningSample.cs @@ -3,20 +3,22 @@ namespace Cnblogs.DashScope.Sample.Text; -public class DataMiningSample : ISample +public class DataMiningSample : TextSample { /// - public string Description => "Data Mining with Qwen-Doc-Turbo"; + public override string Description => "Data Mining with Qwen-Doc-Turbo"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { Console.WriteLine("Uploading file1..."); - var file1 = await client.UploadFileAsync(File.OpenRead("1024-1.txt"), "file1.txt"); - var messages = new List(); - messages.Add(TextChatMessage.System("You are a helpful assistant")); - messages.Add(TextChatMessage.File(file1.Id)); - messages.Add(TextChatMessage.User("这篇文章讲了什么,整理成一个 JSON,需要包含标题(title)和摘要(description)")); + var file1 = await client.OpenAiCompatibleUploadFileAsync(File.OpenRead("1024-1.txt"), "file1.txt"); + var messages = new List + { + TextChatMessage.System("You are a helpful assistant"), + TextChatMessage.File(file1.Id), + TextChatMessage.User("这篇文章讲了什么,整理成一个 JSON,需要包含标题(title)和摘要(description)") + }; messages.ForEach(m => Console.WriteLine($"{m.Role} > {m.Content}")); var completion = client.GetTextCompletionStreamAsync( new ModelRequest() @@ -56,7 +58,7 @@ public async Task RunAsync(IDashScopeClient client) // Deleting files Console.Write("Deleting file1..."); - var result = await client.DeleteFileAsync(file1.Id); + var result = await client.OpenAiCompatibleDeleteFileAsync(file1.Id); Console.WriteLine(result.Deleted ? "Success" : "Failed"); } } diff --git a/sample/Cnblogs.DashScope.Sample/Text/DeepResearchSample.cs b/sample/Cnblogs.DashScope.Sample/Text/DeepResearchSample.cs index 395bb51..ad471a0 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/DeepResearchSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/DeepResearchSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class DeepResearchSample : ISample +public class DeepResearchSample : TextSample { /// - public string Description => "Deep research sample"; + public override string Description => "Deep research sample"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { Console.Clear(); var messages = new List(); diff --git a/sample/Cnblogs.DashScope.Sample/Text/JsonOutputSample.cs b/sample/Cnblogs.DashScope.Sample/Text/JsonOutputSample.cs index c40174d..335d01e 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/JsonOutputSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/JsonOutputSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class JsonOutputSample : ISample +public class JsonOutputSample : TextSample { /// - public string Description => "JSON output text sample"; + public override string Description => "JSON output text sample"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List(); messages.Add(TextChatMessage.System("使用 JSON 输出用户输入的字数信息")); diff --git a/sample/Cnblogs.DashScope.Sample/Text/LongContextSample.cs b/sample/Cnblogs.DashScope.Sample/Text/LongContextSample.cs index 2701673..777de16 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/LongContextSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/LongContextSample.cs @@ -3,25 +3,30 @@ namespace Cnblogs.DashScope.Sample.Text; -public class LongContextSample : ISample +public class LongContextSample : TextSample { /// - public string Description => "File upload and long context model sample"; + public override string Description => "File upload and long context model sample"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { Console.WriteLine("Uploading file1..."); - var file1 = await client.UploadFileAsync(File.OpenRead("1024-1.txt"), "file1.txt"); + var file1 = await client.OpenAiCompatibleUploadFileAsync(File.OpenRead("1024-1.txt"), "file1.txt"); Console.WriteLine("Uploading file2..."); - var file2 = await client.UploadFileAsync(File.OpenRead("1024-2.txt"), "file2.txt"); + var file2 = await client.OpenAiCompatibleUploadFileAsync(File.OpenRead("1024-2.txt"), "file2.txt"); Console.WriteLine($"Uploaded, file1 id: {file1.Id.ToUrl()}, file2 id: {file2.Id.ToUrl()}"); - var messages = new List(); - messages.Add(TextChatMessage.System("You are a helpful assistant")); - messages.Add(TextChatMessage.File(file1.Id)); - messages.Add(TextChatMessage.File(file2.Id)); - messages.Add(TextChatMessage.User("这两篇文章分别讲了什么?")); + await EnsureFileProcessedAsync(client, file1); + await EnsureFileProcessedAsync(client, file2); + + var messages = new List + { + TextChatMessage.System("You are a helpful assistant"), + TextChatMessage.File(file1.Id), + TextChatMessage.File(file2.Id), + TextChatMessage.User("这两篇文章分别讲了什么?") + }; messages.ForEach(m => Console.WriteLine($"{m.Role} > {m.Content}")); var completion = client.GetTextCompletionStreamAsync( @@ -72,12 +77,37 @@ public async Task RunAsync(IDashScopeClient client) // Deleting files Console.Write("Deleting file1..."); - var result = await client.DeleteFileAsync(file1.Id); + var result = await client.OpenAiCompatibleDeleteFileAsync(file1.Id); Console.WriteLine(result.Deleted ? "Success" : "Failed"); Console.Write("Deleting file2..."); - result = await client.DeleteFileAsync(file2.Id); + result = await client.OpenAiCompatibleDeleteFileAsync(file2.Id); Console.WriteLine(result.Deleted ? "Success" : "Failed"); } + + private static async Task EnsureFileProcessedAsync( + IDashScopeClient client, + DashScopeFile file, + int timeoutInSeconds = 5) + { + if (file.Status == "processed") + { + return; + } + + var timeout = Task.Delay(TimeSpan.FromSeconds(timeoutInSeconds)); + while (timeout.IsCompleted == false) + { + var realtime = await client.OpenAiCompatibleGetFileAsync(file.Id); + if (realtime.Status == "processed") + { + return; + } + + await Task.Delay(1000); + } + + throw new InvalidOperationException($"File not processed within timeout, fileId: {file.Id}"); + } } /* diff --git a/sample/Cnblogs.DashScope.Sample/Text/PrefixCompletionSample.cs b/sample/Cnblogs.DashScope.Sample/Text/PrefixCompletionSample.cs index 8dce4ae..f903b8a 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/PrefixCompletionSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/PrefixCompletionSample.cs @@ -3,13 +3,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class PrefixCompletionSample : ISample +public class PrefixCompletionSample : TextSample { /// - public string Description => "Prefix completion sample"; + public override string Description => "Prefix completion sample"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List { diff --git a/sample/Cnblogs.DashScope.Sample/Text/RolePlaySample.cs b/sample/Cnblogs.DashScope.Sample/Text/RolePlaySample.cs index c2d04ba..bd9e010 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/RolePlaySample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/RolePlaySample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class RolePlaySample : ISample +public class RolePlaySample : TextSample { /// - public string Description => "Role play with qwen-character"; + public override string Description => "Role play with qwen-character"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List() { diff --git a/sample/Cnblogs.DashScope.Sample/Text/TranslationSample.cs b/sample/Cnblogs.DashScope.Sample/Text/TranslationSample.cs index a47e04d..8e24873 100644 --- a/sample/Cnblogs.DashScope.Sample/Text/TranslationSample.cs +++ b/sample/Cnblogs.DashScope.Sample/Text/TranslationSample.cs @@ -2,13 +2,13 @@ namespace Cnblogs.DashScope.Sample.Text; -public class TranslationSample : ISample +public class TranslationSample : TextSample { /// - public string Description => "Translate with Qwen-MT models"; + public override string Description => "Translate with Qwen-MT models"; /// - public async Task RunAsync(IDashScopeClient client) + public async override Task RunAsync(IDashScopeClient client) { var messages = new List { diff --git a/sample/Cnblogs.DashScope.Sample/TextSample.cs b/sample/Cnblogs.DashScope.Sample/TextSample.cs new file mode 100644 index 0000000..a780bd3 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/TextSample.cs @@ -0,0 +1,15 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample; + +public abstract class TextSample : ISample +{ + /// + public string Group => "Text"; + + /// + public abstract string Description { get; } + + /// + public abstract Task RunAsync(IDashScopeClient client); +} diff --git a/sample/Cnblogs.DashScope.Sample/noise.wav b/sample/Cnblogs.DashScope.Sample/noise.wav new file mode 100644 index 0000000..0aca97e Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/noise.wav differ diff --git a/src/Cnblogs.DashScope.AI/Cnblogs.DashScope.AI.csproj b/src/Cnblogs.DashScope.AI/Cnblogs.DashScope.AI.csproj index 4685740..039cbfe 100644 --- a/src/Cnblogs.DashScope.AI/Cnblogs.DashScope.AI.csproj +++ b/src/Cnblogs.DashScope.AI/Cnblogs.DashScope.AI.csproj @@ -1,6 +1,6 @@  - net8.0 + net8.0 Cnblogs.DashScope.AI true Cnblogs;Dashscope;Microsoft.Extensions.AI;Sdk;Embedding; @@ -12,7 +12,7 @@ - + diff --git a/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs b/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs index ab0007c..89d0047 100644 --- a/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs +++ b/src/Cnblogs.DashScope.AI/DashScopeChatClient.cs @@ -15,6 +15,7 @@ public sealed class DashScopeChatClient : IChatClient { private readonly IDashScopeClient _dashScopeClient; private readonly string _modelId; + private readonly bool _useVl; private static readonly JsonSchema EmptyObjectSchema = JsonSchema.FromText("{\"type\":\"object\",\"required\":[],\"properties\":{}}"); @@ -34,6 +35,10 @@ public DashScopeChatClient(IDashScopeClient dashScopeClient, string modelId) _dashScopeClient = dashScopeClient; _modelId = modelId; + _useVl = modelId.StartsWith("qwen-vl") + || modelId.StartsWith("qwen3-vl") + || modelId.StartsWith("qwen3-omni") + || modelId.StartsWith("gui-plus"); } /// @@ -50,7 +55,7 @@ public async Task GetResponseAsync( var modelId = options?.ModelId ?? _modelId; var useVlRaw = options?.AdditionalProperties?.GetValueOrDefault("useVl")?.ToString(); var useVl = string.IsNullOrEmpty(useVlRaw) - ? modelId.Contains("qwen-vl", StringComparison.OrdinalIgnoreCase) + ? _useVl : string.Equals(useVlRaw, "true", StringComparison.OrdinalIgnoreCase); if (useVl) { @@ -96,8 +101,9 @@ public async Task GetResponseAsync( { Input = new TextGenerationInput { - Messages = chatMessages.SelectMany( - c => ToTextChatMessages(c, parameters.Tools?.ToList())), + Messages = chatMessages.SelectMany(c => ToTextChatMessages( + c, + parameters.Tools?.ToList())), Tools = ToToolDefinitions(options?.Tools) }, Model = modelId, @@ -135,8 +141,9 @@ public async IAsyncEnumerable GetStreamingResponseAsync( [EnumeratorCancellation] CancellationToken cancellationToken = default) { var useVlRaw = options?.AdditionalProperties?.GetValueOrDefault("useVl")?.ToString(); - var useVl = string.Equals(useVlRaw, "true", StringComparison.OrdinalIgnoreCase) - || (options?.ModelId?.Contains("qwen-vl") ?? false); + var useVl = string.IsNullOrEmpty(useVlRaw) + ? _useVl + : string.Equals(useVlRaw, "true", StringComparison.OrdinalIgnoreCase); var modelId = options?.ModelId ?? _modelId; ChatRole? streamedRole = null; @@ -220,8 +227,9 @@ public async IAsyncEnumerable GetStreamingResponseAsync( { Input = new TextGenerationInput { - Messages = chatMessages.SelectMany( - c => ToTextChatMessages(c, parameters.Tools?.ToList())), + Messages = chatMessages.SelectMany(c => ToTextChatMessages( + c, + parameters.Tools?.ToList())), Tools = ToToolDefinitions(options?.Tools) }, Model = modelId, @@ -248,7 +256,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)); } @@ -261,6 +269,7 @@ public async IAsyncEnumerable GetStreamingResponseAsync( { InputTokenCount = response.Usage.InputTokens, OutputTokenCount = response.Usage.OutputTokens, + TotalTokenCount = response.Usage.TotalTokens, })); } @@ -292,8 +301,9 @@ public void Dispose() : finishReason switch { "stop" => ChatFinishReason.Stop, - "length" => ChatFinishReason.ContentFilter, + "length" => ChatFinishReason.Length, "tool_calls" => ChatFinishReason.ToolCalls, + "null" => null, _ => new ChatFinishReason(finishReason), }; @@ -311,18 +321,17 @@ private static ChatMessage ToChatMessage(TextChatMessage message) if (message.ToolCalls is { Count: > 0 }) { - message.ToolCalls.ForEach( - call => - { - var arguments = string.IsNullOrEmpty(call.Function.Arguments) - ? null - : JsonSerializer.Deserialize>(call.Function.Arguments); - returnMessage.Contents.Add( - new FunctionCallContent( - call.Id ?? string.Empty, - call.Function.Name, - arguments) { RawRepresentation = call }); - }); + message.ToolCalls.ForEach(call => + { + var arguments = string.IsNullOrEmpty(call.Function.Arguments) + ? null + : JsonSerializer.Deserialize>(call.Function.Arguments); + returnMessage.Contents.Add( + new FunctionCallContent( + call.Id ?? string.Empty, + call.Function.Name, + arguments) { RawRepresentation = call }); + }); } return returnMessage; @@ -340,19 +349,26 @@ private static ChatRole ToChatRole(string role) private MultimodalParameters ToMultimodalParameters(ChatOptions? options) { - var parameters = new MultimodalParameters(); if (options is null) { - return parameters; + return new MultimodalParameters(); } - parameters.Temperature = options.Temperature; - parameters.MaxTokens = options.MaxOutputTokens; - parameters.TopP = options.TopP; - parameters.TopK = options.TopK; - parameters.RepetitionPenalty = options.FrequencyPenalty; - parameters.PresencePenalty = options.PresencePenalty; - parameters.Seed = (ulong?)options.Seed; + if (options.AdditionalProperties?.GetValueOrDefault("raw") is MultimodalParameters raw) + { + return raw; + } + + var parameters = new MultimodalParameters + { + Temperature = options.Temperature, + MaxTokens = options.MaxOutputTokens, + TopP = options.TopP, + TopK = options.TopK, + RepetitionPenalty = options.FrequencyPenalty, + PresencePenalty = options.PresencePenalty, + Seed = (ulong?)options.Seed + }; if (options.StopSequences is { Count: > 0 }) { parameters.Stop = new TextGenerationStop(options.StopSequences); @@ -391,6 +407,7 @@ private List ToMultimodalMessageContents(IList raw, TextContent text => MultimodalMessageContent.TextContent(text.Text), DataContent { Data.Length: > 0 } data when data.HasTopLevelMediaType("image") => MultimodalMessageContent.ImageContent( @@ -398,6 +415,10 @@ private List ToMultimodalMessageContents(IList MultimodalMessageContent.ImageContent(uri), + DataContent { Uri: { } uri } data when data.HasTopLevelMediaType("video") => MultimodalMessageContent + .VideoContent(uri), + UriContent uri when uri.HasTopLevelMediaType("image") => MultimodalMessageContent.ImageContent( + uri.Uri.AbsoluteUri), _ => null }; if (content is not null) @@ -420,6 +441,11 @@ private IEnumerable ToTextChatMessages( { if (from.Role == ChatRole.System || from.Role == ChatRole.User) { + if (from.RawRepresentation is TextChatMessage text) + { + yield return text; + } + yield return new TextChatMessage( from.Role.Value, from.Text, @@ -452,12 +478,11 @@ private IEnumerable ToTextChatMessages( { var functionCall = from.Contents .OfType() - .Select( - c => new ToolCall( - c.CallId, - "function", - tools?.FindIndex(f => f.Function?.Name == c.Name) ?? -1, - new FunctionCall(c.Name, JsonSerializer.Serialize(c.Arguments, ToolCallJsonSerializerOptions)))) + .Select(c => new ToolCall( + c.CallId, + "function", + tools?.FindIndex(f => f.Function?.Name == c.Name) ?? -1, + new FunctionCall(c.Name, JsonSerializer.Serialize(c.Arguments, ToolCallJsonSerializerOptions)))) .ToList(); // function all array must be null when empty @@ -479,6 +504,11 @@ private IEnumerable ToTextChatMessages( return null; } + if (options.AdditionalProperties?.GetValueOrDefault("raw") is TextGenerationParameters parameters) + { + return parameters; + } + var format = "message"; if (options.ResponseFormat is ChatResponseFormatJson) { @@ -510,13 +540,12 @@ RequiredChatToolMode required when string.IsNullOrEmpty(required.RequiredFunctio private static IEnumerable? ToToolDefinitions(IList? tools) { - return tools?.OfType().Select( - f => new ToolDefinition( - "function", - new FunctionDefinition( - f.Name, - f.Description, - GetParameterSchema(f.JsonSchema)))); + return tools?.OfType().Select(f => new ToolDefinition( + "function", + new FunctionDefinition( + f.Name, + f.Description, + GetParameterSchema(f.JsonSchema)))); } private static JsonSchema GetParameterSchema(JsonElement metadata) diff --git a/src/Cnblogs.DashScope.Core/Cnblogs.DashScope.Core.csproj b/src/Cnblogs.DashScope.Core/Cnblogs.DashScope.Core.csproj index 7dd23dd..c5fab03 100644 --- a/src/Cnblogs.DashScope.Core/Cnblogs.DashScope.Core.csproj +++ b/src/Cnblogs.DashScope.Core/Cnblogs.DashScope.Core.csproj @@ -13,6 +13,9 @@ + + + diff --git a/src/Cnblogs.DashScope.Core/DashScopeClientCore.cs b/src/Cnblogs.DashScope.Core/DashScopeClientCore.cs index 8bded6e..5041955 100644 --- a/src/Cnblogs.DashScope.Core/DashScopeClientCore.cs +++ b/src/Cnblogs.DashScope.Core/DashScopeClientCore.cs @@ -242,7 +242,7 @@ public async Task - public async Task UploadFileAsync( + public async Task OpenAiCompatibleUploadFileAsync( Stream file, string filename, string purpose = "file-extract", @@ -251,30 +251,44 @@ public async Task UploadFileAsync( var form = new MultipartFormDataContent(); form.Add(new StreamContent(file), "file", filename); form.Add(new StringContent(purpose), nameof(purpose)); - var request = new HttpRequestMessage(HttpMethod.Post, ApiLinks.Files) { Content = form }; + var request = new HttpRequestMessage(HttpMethod.Post, ApiLinks.FilesCompatible) { Content = form }; return (await SendCompatibleAsync(request, cancellationToken))!; } /// - public async Task GetFileAsync(DashScopeFileId id, CancellationToken cancellationToken = default) + public async Task OpenAiCompatibleGetFileAsync( + DashScopeFileId id, + CancellationToken cancellationToken = default) { - var request = BuildRequest(HttpMethod.Get, ApiLinks.Files + $"/{id}"); + var request = BuildRequest(HttpMethod.Get, ApiLinks.FilesCompatible + $"/{id}"); return (await SendCompatibleAsync(request, cancellationToken))!; } /// - public async Task ListFilesAsync(CancellationToken cancellationToken = default) + public async Task OpenAiCompatibleListFilesAsync( + string? after = null, + int? limit = null, + string? createAfter = null, + string? createBefore = null, + string? purpose = null, + CancellationToken cancellationToken = default) { - var request = BuildRequest(HttpMethod.Get, ApiLinks.Files); - return (await SendCompatibleAsync(request, cancellationToken))!; + var queryString = new QueryStringBuilder() + .Add(after) + .Add(limit) + .Add(createAfter, "create_after") + .Add(createBefore, "create_before") + .Add(purpose); + var request = BuildRequest(HttpMethod.Get, ApiLinks.FilesCompatible + queryString.Build()); + return (await SendCompatibleAsync(request, cancellationToken))!; } /// - public async Task DeleteFileAsync( + public async Task OpenAiCompatibleDeleteFileAsync( DashScopeFileId id, CancellationToken cancellationToken = default) { - var request = BuildRequest(HttpMethod.Delete, ApiLinks.Files + $"/{id}"); + var request = BuildRequest(HttpMethod.Delete, ApiLinks.FilesCompatible + $"/{id}"); return (await SendCompatibleAsync(request, cancellationToken))!; } @@ -332,7 +346,9 @@ public async Task UploadTemporaryFileAsync( form.Add(GetFormDataStringContent(policy.Data.XOssForbidOverwrite, "x-oss-forbid-overwrite")); var file = new StreamContent(fileStream); file.Headers.ContentType = null; - file.Headers.TryAddWithoutValidation("Content-Disposition", $"form-data; name=\"file\"; filename=\"{filename}\""); + file.Headers.TryAddWithoutValidation( + "Content-Disposition", + $"form-data; name=\"file\"; filename=\"{filename}\""); file.Headers.TryAddWithoutValidation("Content-Type", "application/octet-stream"); form.Add(file); var response = await _httpClient.PostAsync(policy.Data.UploadHost, form); @@ -348,6 +364,94 @@ public async Task UploadTemporaryFileAsync( await response.Content.ReadAsStringAsync()); } + /// + public async Task> UploadFilesAsync( + string purpose, + IEnumerable files, + bool leaveStreamOpen = false) + { + var form = DashScopeMultipartContent.Create(); + form.Add(GetFormDataStringContent(purpose, nameof(purpose))); + + List? toClose = null; + foreach (var fileData in files) + { + var file = new StreamContent(fileData.FileStream); + file.Headers.ContentType = null; + file.Headers.TryAddWithoutValidation( + "Content-Disposition", + $"form-data; name=\"file\"; filename=\"{fileData.FileName}\""); + form.Add(file); + if (string.IsNullOrWhiteSpace(fileData.Description) == false) + { + form.Add(GetFormDataStringContent(fileData.Description, "description")); + } + + if (!leaveStreamOpen) + { + toClose ??= new List(); + toClose.Add(fileData.FileStream); + } + } + + var response = await _httpClient.PostAsync(ApiLinks.Files(), form); + if (toClose?.Count > 0) + { + toClose.ForEach(x => x.Dispose()); + } + + return (await response.Content.ReadFromJsonAsync>( + DashScopeDefaults.SerializationOptions))!; + } + + /// + public async Task> ListFilesAsync( + int pageNo, + int pageSize, + CancellationToken cancellationToken = default) + { + var query = new QueryStringBuilder().Add(pageNo, "page_no").Add(pageSize, "page_size"); + var request = BuildRequest(HttpMethod.Get, ApiLinks.Files() + query.Build()); + var response = await SendAsync>(request, cancellationToken); + return response!; + } + + /// + public Task> GetFileAsync( + DashScopeFileId fileId, + CancellationToken cancellationToken = default) + { + return GetFileAsync(fileId.Value, cancellationToken); + } + + /// + public async Task> GetFileAsync( + string fileId, + CancellationToken cancellationToken = default) + { + var request = BuildRequest(HttpMethod.Get, ApiLinks.Files(fileId)); + var response = await SendAsync>(request, cancellationToken); + return response!; + } + + /// + public Task DeleteFileAsync( + DashScopeFileId fileId, + CancellationToken cancellationToken = default) + { + return DeleteFileAsync(fileId.Value, cancellationToken); + } + + /// + public async Task DeleteFileAsync( + string fileId, + CancellationToken cancellationToken = default) + { + var request = BuildRequest(HttpMethod.Delete, ApiLinks.Files(fileId)); + var response = await SendAsync(request, cancellationToken); + return response!; + } + private static StringContent GetFormDataStringContent(string value, string key) { var content = new StringContent(value); @@ -385,6 +489,8 @@ private static HttpRequestMessage BuildRequest( if (sse) { message.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/event-stream")); + // some model requires this header to enable incremental output. + message.Headers.Add("X-DashScope-SSE", "enable"); } if (isTask) @@ -446,28 +552,31 @@ private async IAsyncEnumerable StreamAsync( HttpCompletionOption.ResponseHeadersRead, cancellationToken); using StreamReader reader = new(await response.Content.ReadAsStreamAsync(cancellationToken), Encoding.UTF8); - while (!reader.EndOfStream) + while (await reader.ReadLineAsync() is { } line) { if (cancellationToken.IsCancellationRequested) + { throw new TaskCanceledException(); + } + + if (line.StartsWith("data:") == false) + { + continue; + } - var line = await reader.ReadLineAsync(); - if (line != null && line.StartsWith("data:")) + var data = line["data:".Length..]; + if (data.StartsWith("{\"code\":")) { - var data = line["data:".Length..]; - if (data.StartsWith("{\"code\":")) - { - var error = - JsonSerializer.Deserialize(data, DashScopeDefaults.SerializationOptions)!; - throw new DashScopeException( - message.RequestUri?.ToString(), - (int)response.StatusCode, - error, - error.Message); - } - - yield return JsonSerializer.Deserialize(data, DashScopeDefaults.SerializationOptions)!; + var error = + JsonSerializer.Deserialize(data, DashScopeDefaults.SerializationOptions)!; + throw new DashScopeException( + message.RequestUri?.ToString(), + (int)response.StatusCode, + error, + error.Message); } + + yield return JsonSerializer.Deserialize(data, DashScopeDefaults.SerializationOptions)!; } } diff --git a/src/Cnblogs.DashScope.Core/DashScopeFailedUploadRecord.cs b/src/Cnblogs.DashScope.Core/DashScopeFailedUploadRecord.cs new file mode 100644 index 0000000..7def05a --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeFailedUploadRecord.cs @@ -0,0 +1,9 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represents one failed upload record. +/// +/// File name. +/// Error code. +/// Error message. +public record DashScopeFailedUploadRecord(string Name, string Code, string Message); diff --git a/src/Cnblogs.DashScope.Core/DashScopeFile.cs b/src/Cnblogs.DashScope.Core/DashScopeFile.cs index a544a2c..eb7c302 100644 --- a/src/Cnblogs.DashScope.Core/DashScopeFile.cs +++ b/src/Cnblogs.DashScope.Core/DashScopeFile.cs @@ -9,10 +9,12 @@ /// Unix timestamp(in seconds) of file create time. /// Name of the file. /// Purpose of the file. +/// Status of the file. public record DashScopeFile( DashScopeFileId Id, string Object, int Bytes, int CreatedAt, string Filename, - string? Purpose); + string? Purpose, + string Status); diff --git a/src/Cnblogs.DashScope.Core/DashScopeFileDetail.cs b/src/Cnblogs.DashScope.Core/DashScopeFileDetail.cs new file mode 100644 index 0000000..774b8bc --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeFileDetail.cs @@ -0,0 +1,28 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Detail info of a DashScope file. +/// +/// ID of the file, can be used in model request. +/// Name of the file. +/// Description of the file. +/// File size in byte. +/// File's MD5. +/// Upload time. +/// Download link of the file. +/// Uploader's ID. +/// Region of the file. +/// ID of the api key which uploaded this file. +/// Internal ID of the file. +public record DashScopeFileDetail( + DashScopeFileId FileId, + string Name, + string Description, + int Size, + string Md5, + string GmtCreate, + string Url, + string? UserId, + string? Region, + string? ApiKeyId, + int? Id); diff --git a/src/Cnblogs.DashScope.Core/DashScopeFileResponse.cs b/src/Cnblogs.DashScope.Core/DashScopeFileResponse.cs new file mode 100644 index 0000000..64d3f41 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeFileResponse.cs @@ -0,0 +1,15 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represent a file api response. +/// +/// Unique ID of the request. +public record DashScopeFileResponse(string RequestId); + +/// +/// Represent a file api response. +/// +/// Unique ID of the request. +/// Data of the response. +/// Type of the data. +public record DashScopeFileResponse(string RequestId, TData Data) : DashScopeFileResponse(RequestId); diff --git a/src/Cnblogs.DashScope.Core/DashScopeListFilesData.cs b/src/Cnblogs.DashScope.Core/DashScopeListFilesData.cs new file mode 100644 index 0000000..921c9e9 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeListFilesData.cs @@ -0,0 +1,10 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represent one page of file list. +/// +/// Total count of files. +/// Page index. +/// Page size. +/// File item list. +public record DashScopeListFilesData(int Total, int PageNo, int PageSize, List Files); diff --git a/src/Cnblogs.DashScope.Core/DashScopeFileList.cs b/src/Cnblogs.DashScope.Core/DashScopeOpenAiCompatibleFileList.cs similarity index 72% rename from src/Cnblogs.DashScope.Core/DashScopeFileList.cs rename to src/Cnblogs.DashScope.Core/DashScopeOpenAiCompatibleFileList.cs index 447bc23..18874e1 100644 --- a/src/Cnblogs.DashScope.Core/DashScopeFileList.cs +++ b/src/Cnblogs.DashScope.Core/DashScopeOpenAiCompatibleFileList.cs @@ -6,4 +6,4 @@ /// Always be "list". /// True if not reached last page. /// Items of current page. -public record DashScopeFileList(string Object, bool HasMore, List Data); +public record DashScopeOpenAiCompatibleFileList(string Object, bool HasMore, List Data); diff --git a/src/Cnblogs.DashScope.Core/DashScopeUploadFileData.cs b/src/Cnblogs.DashScope.Core/DashScopeUploadFileData.cs new file mode 100644 index 0000000..c0d9f73 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeUploadFileData.cs @@ -0,0 +1,10 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represents upload file result data. +/// +/// Successful uploads. +/// Failed uploads. +public record DashScopeUploadFileData( + List UploadedFiles, + List FailedUploads); diff --git a/src/Cnblogs.DashScope.Core/DashScopeUploadFileInput.cs b/src/Cnblogs.DashScope.Core/DashScopeUploadFileInput.cs new file mode 100644 index 0000000..baa6854 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeUploadFileInput.cs @@ -0,0 +1,9 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represents one file input. +/// +/// File data. +/// Name of the file. +/// Description of the file. +public record DashScopeUploadFileInput(Stream FileStream, string FileName, string? Description = null); diff --git a/src/Cnblogs.DashScope.Core/DashScopeUploadedFileRecord.cs b/src/Cnblogs.DashScope.Core/DashScopeUploadedFileRecord.cs new file mode 100644 index 0000000..32916d6 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/DashScopeUploadedFileRecord.cs @@ -0,0 +1,8 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Represents one uploaded file. +/// +/// File Id. +/// File name. +public record DashScopeUploadedFileRecord(DashScopeFileId FileId, string Name); diff --git a/src/Cnblogs.DashScope.Core/IDashScopeClient.cs b/src/Cnblogs.DashScope.Core/IDashScopeClient.cs index 679477d..14938a7 100644 --- a/src/Cnblogs.DashScope.Core/IDashScopeClient.cs +++ b/src/Cnblogs.DashScope.Core/IDashScopeClient.cs @@ -202,7 +202,7 @@ Task> CreateImageGene /// The input of the task. /// The cancellation token to use. /// - public Task> + Task> CreateBackgroundGenerationTaskAsync( ModelRequest input, CancellationToken cancellationToken = default); @@ -215,7 +215,7 @@ public Task /// Purpose of the file, use "file-extract" to allow model access the file. Use "batch" for uploading batch operations .jsonl file. /// The cancellation token to use. /// - public Task UploadFileAsync( + Task OpenAiCompatibleUploadFileAsync( Stream file, string filename, string purpose = "file-extract", @@ -224,18 +224,29 @@ public Task UploadFileAsync( /// /// Get DashScope file by id. /// - /// Id of the file. + /// ID of the file. /// The cancellation token to use. /// /// Throws when file not exists, Status will be 404 in this case. - public Task GetFileAsync(DashScopeFileId id, CancellationToken cancellationToken = default); + Task OpenAiCompatibleGetFileAsync(DashScopeFileId id, CancellationToken cancellationToken = default); /// /// List DashScope files. /// + /// Fetch items after given file id. + /// Limit item count per page. + /// Filter files that created after given time. e.g. 20250306123000 + /// Filter files that created before given time. e.g. 20250306123000 + /// Filter files with given purpose. e.g. file-extract or batch. /// The cancellation token to use. /// - public Task ListFilesAsync(CancellationToken cancellationToken = default); + Task OpenAiCompatibleListFilesAsync( + string? after = null, + int? limit = null, + string? createAfter = null, + string? createBefore = null, + string? purpose = null, + CancellationToken cancellationToken = default); /// /// Delete DashScope file. @@ -244,7 +255,7 @@ public Task UploadFileAsync( /// The cancellation token to use. /// /// Throws when file not exists, Status would be 404. - public Task DeleteFileAsync( + Task OpenAiCompatibleDeleteFileAsync( DashScopeFileId id, CancellationToken cancellationToken = default); @@ -254,17 +265,17 @@ public Task DeleteFileAsync( /// The model to use. /// Cancellation token. /// - public Task CreateSpeechSynthesizerSocketSessionAsync( + Task CreateSpeechSynthesizerSocketSessionAsync( string modelId, CancellationToken cancellationToken = default); /// - /// Get a temporary upload grant for to access. + /// Get a temporary upload grant for to access. /// /// The name of the model. - /// + /// The to use. /// - public Task GetTemporaryUploadPolicyAsync( + Task GetTemporaryUploadPolicyAsync( string modelId, CancellationToken cancellationToken = default); @@ -277,7 +288,7 @@ public Task CreateSpeechSynthesizerSocketSession /// /// Oss url of the file. /// Throws if response code is not 200. - public Task UploadTemporaryFileAsync( + Task UploadTemporaryFileAsync( string modelId, Stream fileStream, string filename, @@ -291,8 +302,70 @@ public Task UploadTemporaryFileAsync( /// The grant info. /// /// Throws if response code is not 200. - public Task UploadTemporaryFileAsync( + Task UploadTemporaryFileAsync( Stream fileStream, string filename, DashScopeTemporaryUploadPolicy policy); + + /// + /// Upload multiple files. + /// + /// Purpose of the file, can be 'file-extract', 'fine-tune', 'batch'. + /// The files to upload. + /// Do not dispose streams after request sent. + /// + Task> UploadFilesAsync( + string purpose, + IEnumerable files, + bool leaveStreamOpen = false); + + /// + /// List uploaded files. + /// + /// Page index. + /// Page size. + /// The to use. + /// + Task> ListFilesAsync( + int pageNo, + int pageSize, + CancellationToken cancellationToken = default); + + /// + /// Get uploaded file detail. + /// + /// The id of the file. + /// The to use. + /// + Task> GetFileAsync( + DashScopeFileId fileId, + CancellationToken cancellationToken = default); + + /// + /// Get uploaded file detail. + /// + /// The ID of the file. + /// The to use. + /// + Task> GetFileAsync( + string fileId, + CancellationToken cancellationToken = default); + + /// + /// Delete uploaded file. + /// + /// The ID of the file. + /// The to use. + /// + Task DeleteFileAsync( + DashScopeFileId fileId, + CancellationToken cancellationToken = default); + + /// + /// Delete uploaded file. + /// + /// The ID of the file. + /// The to use. + /// + Task DeleteFileAsync(string fileId, CancellationToken cancellationToken = default); } diff --git a/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs b/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs index 46566e1..f904ea4 100644 --- a/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs +++ b/src/Cnblogs.DashScope.Core/ITextGenerationParameters.cs @@ -99,4 +99,9 @@ public interface ITextGenerationParameters /// or visit the official doc for more information: https://help.aliyun.com/zh/model-studio/role-play /// Dictionary? LogitBias { get; set; } + + /// + /// Allow model to call internal Python interpreter. Can not use with tools. + /// + bool? EnableCodeInterpreter { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/Internals/ApiLinks.cs b/src/Cnblogs.DashScope.Core/Internals/ApiLinks.cs index aebeb4f..5cc65ca 100644 --- a/src/Cnblogs.DashScope.Core/Internals/ApiLinks.cs +++ b/src/Cnblogs.DashScope.Core/Internals/ApiLinks.cs @@ -11,6 +11,7 @@ internal static class ApiLinks public const string Tasks = "tasks/"; public const string Uploads = "uploads/"; public const string Tokenizer = "tokenizer"; - public const string Files = "/compatible-mode/v1/files"; + public static string Files(string? id = null) => string.IsNullOrWhiteSpace(id) ? "files" : $"files/{id}"; + public const string FilesCompatible = "/compatible-mode/v1/files"; public static string Application(string applicationId) => $"apps/{applicationId}/completion"; } diff --git a/src/Cnblogs.DashScope.Core/Internals/QueryStringBuilder.cs b/src/Cnblogs.DashScope.Core/Internals/QueryStringBuilder.cs new file mode 100644 index 0000000..2f28dd3 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/Internals/QueryStringBuilder.cs @@ -0,0 +1,42 @@ +using System.Runtime.CompilerServices; +using System.Web; + +namespace Cnblogs.DashScope.Core.Internals; + +internal class QueryStringBuilder +{ + private readonly List> _items = new(); + + public QueryStringBuilder Add(T? value, [CallerArgumentExpression("value")] string? key = null) + => value switch + { + null => Add(key, null), + Enum e => Add(key, e.ToString("D")), + _ => Add(key, value.ToString()) + }; + + private QueryStringBuilder Add(string? parameterName, string? value) + { + ArgumentNullException.ThrowIfNull(parameterName); + if (string.IsNullOrEmpty(value)) + { + return this; + } + + _items.Add(new KeyValuePair(parameterName, value)); + return this; + } + + public string Build() + { + if (_items.Count == 0) + { + return string.Empty; + } + + var partial = string.Join( + '&', + _items.Select(x => $"{HttpUtility.UrlEncode(x.Key)}={HttpUtility.UrlEncode(x.Value)}")); + return $"?{partial}"; + } +} diff --git a/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs new file mode 100644 index 0000000..104a10e --- /dev/null +++ b/src/Cnblogs.DashScope.Core/Internals/TextChatMessageContentConvertor.cs @@ -0,0 +1,65 @@ +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 docUrlContent = contents.FirstOrDefault(x => x is { DocUrl: not null, FileParsingStrategy: not null }) + ?? throw new JsonException("No doc_url and file_parsing_strategy were found"); + var docUrls = docUrlContent.DocUrl; + var strategy = docUrlContent.FileParsingStrategy; + return new TextChatMessageContent(text, docUrls, strategy); + } + + 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 = value.FileParsingStrategy + } + }, + 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/MultimodalInputTokenDetails.cs b/src/Cnblogs.DashScope.Core/MultimodalInputTokenDetails.cs index 8df996f..9b72d4f 100644 --- a/src/Cnblogs.DashScope.Core/MultimodalInputTokenDetails.cs +++ b/src/Cnblogs.DashScope.Core/MultimodalInputTokenDetails.cs @@ -6,4 +6,9 @@ /// Token count of image. /// Token count of video. /// Token count of text. -public record MultimodalInputTokenDetails(int? ImageTokens = null, int? VideoTokens = null, int? TextTokens = null); +/// Token count of audio. +public record MultimodalInputTokenDetails( + int? ImageTokens = null, + int? VideoTokens = null, + int? TextTokens = null, + int? AudioTokens = null); diff --git a/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs b/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs index 5663054..4f3bbdf 100644 --- a/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs +++ b/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs @@ -11,6 +11,7 @@ /// For qwen-vl-ocr only. Maximum pixels for ocr task. /// For qwen-vl-ocr only. Rotate before ocr. /// For video content, model will read the video by 1/fps seconds; for frame sequence, indicate that the frame is captured by 1/fps seconds. +/// Extra data from OCR task. public record MultimodalMessageContent( string? Image = null, string? Text = null, diff --git a/src/Cnblogs.DashScope.Core/TextChatMessage.cs b/src/Cnblogs.DashScope.Core/TextChatMessage.cs index c9301c1..9ef595d 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,23 @@ public static TextChatMessage File(IEnumerable fileIds) return new TextChatMessage(fileIds); } + /// + /// Create a docUrls message. + /// + /// Text input. + /// The doc urls. + /// Can be one of ['auto', 'text_only', 'text_and_images']. + /// + public static TextChatMessage DocUrl( + string prompt, + IEnumerable docUrls, + string fileParsingStrategy = "auto") + { + return new TextChatMessage( + DashScopeRoleNames.User, + new TextChatMessageContent(prompt, docUrls, fileParsingStrategy)); + } + /// /// 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..9d00c48 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextChatMessageContent.cs @@ -0,0 +1,70 @@ +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; } + + /// + /// Control the content that model can read. Can be one of ['auto', 'text_only', 'text_and_images']. + /// + public string? FileParsingStrategy { get; } + + /// + /// Creates a with text content. + /// + /// The text content. + public TextChatMessageContent(string text) + { + Text = text; + DocUrls = null; + FileParsingStrategy = null; + } + + /// + /// Creates a with text content and doc urls. + /// + /// The text content. + /// The doc urls. + /// Can be one of ['auto', 'text_only', 'text_and_images']. + public TextChatMessageContent(string text, IEnumerable? docUrls, string? fileParsingStrategy) + { + Text = text; + DocUrls = docUrls; + FileParsingStrategy = fileParsingStrategy; + } + + /// + /// 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/TextGenerationCodeInterpreterPluginUsage.cs b/src/Cnblogs.DashScope.Core/TextGenerationCodeInterpreterPluginUsage.cs new file mode 100644 index 0000000..0b641b7 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/TextGenerationCodeInterpreterPluginUsage.cs @@ -0,0 +1,21 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Token usages of code interpreter plugin. +/// +public class TextGenerationCodeInterpreterPluginUsage +{ + /// + /// Initialize a with count. + /// + /// Usage count. + public TextGenerationCodeInterpreterPluginUsage(int count) + { + Count = count; + } + + /// + /// Token usage count. + /// + public int Count { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs b/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs index f379ac7..1f3dbf1 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationOutput.cs @@ -29,4 +29,9 @@ public class TextGenerationOutput /// Not null when . configured to show source. /// public TextGenerationWebSearchInfo? SearchInfo { get; set; } + + /// + /// Outputs from the tool being called by model. + /// + public List? ToolInfo { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs b/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs index 84578ba..f87d0d9 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationParameters.cs @@ -74,6 +74,9 @@ public class TextGenerationParameters : ITextGenerationParameters /// public Dictionary? LogitBias { get; set; } + /// + public bool? EnableCodeInterpreter { get; set; } + /// public bool? IncrementalOutput { get; set; } } diff --git a/src/Cnblogs.DashScope.Core/TextGenerationPluginUsages.cs b/src/Cnblogs.DashScope.Core/TextGenerationPluginUsages.cs index 40b5d9a..76588af 100644 --- a/src/Cnblogs.DashScope.Core/TextGenerationPluginUsages.cs +++ b/src/Cnblogs.DashScope.Core/TextGenerationPluginUsages.cs @@ -3,5 +3,26 @@ /// /// Plugin usages. /// -/// Usage of search plugin. -public record TextGenerationPluginUsages(TextGenerationSearchPluginUsage? Search); +public class TextGenerationPluginUsages +{ + /// + /// Plugin usages. + /// + /// Usage of search plugin. + /// Usage of code interpreter plugin. + public TextGenerationPluginUsages( + TextGenerationSearchPluginUsage? search = null, + TextGenerationCodeInterpreterPluginUsage? codeInterpreter = null) + { + Search = search; + CodeInterpreter = codeInterpreter; + } + + /// Usage of search plugin. + public TextGenerationSearchPluginUsage? Search { get; set; } + + /// + /// Usage of code interpreter plugin. + /// + public TextGenerationCodeInterpreterPluginUsage? CodeInterpreter { get; set; } +} 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/src/Cnblogs.DashScope.Core/ToolInfoCodeInterpreterOutput.cs b/src/Cnblogs.DashScope.Core/ToolInfoCodeInterpreterOutput.cs new file mode 100644 index 0000000..62f055a --- /dev/null +++ b/src/Cnblogs.DashScope.Core/ToolInfoCodeInterpreterOutput.cs @@ -0,0 +1,12 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Output from the code interpreter tool. +/// +public class ToolInfoCodeInterpreterOutput +{ + /// + /// Code that being executed. + /// + public string Code { get; set; } = string.Empty; +} diff --git a/src/Cnblogs.DashScope.Core/ToolInfoOutput.cs b/src/Cnblogs.DashScope.Core/ToolInfoOutput.cs new file mode 100644 index 0000000..4c1b2e6 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/ToolInfoOutput.cs @@ -0,0 +1,17 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Outputs from the tools. +/// +public class ToolInfoOutput +{ + /// + /// Output from the code interpreter. + /// + public ToolInfoCodeInterpreterOutput? CodeInterpreter { get; set; } + + /// + /// Type of the tool. + /// + public string Type { get; set; } = string.Empty; +} diff --git a/test/Cnblogs.DashScope.AI.UnitTests/ChatClientTests.cs b/test/Cnblogs.DashScope.AI.UnitTests/ChatClientTests.cs index 8bd80fa..7d8307a 100644 --- a/test/Cnblogs.DashScope.AI.UnitTests/ChatClientTests.cs +++ b/test/Cnblogs.DashScope.AI.UnitTests/ChatClientTests.cs @@ -1,7 +1,6 @@ using System.Text; using Cnblogs.DashScope.Core; using Cnblogs.DashScope.Tests.Shared.Utils; - using Microsoft.Extensions.AI; using NSubstitute; using NSubstitute.Extensions; @@ -10,6 +9,43 @@ namespace Cnblogs.DashScope.AI.UnitTests; public class ChatClientTests { + [Fact] + public async Task ChatClient_TextCompletionRaw_SuccessAsync() + { + // Arrange + var testCase = Snapshots.TextGeneration.MessageFormat.ConversationMessageWithDocUrlsIncremental; + var dashScopeClient = Substitute.For(); + dashScopeClient.Configure() + .GetTextCompletionStreamAsync( + Arg.Any>(), + Arg.Any()) + .Returns(AsyncEnumerable.Repeat(testCase.ResponseModel, 1)); + var client = dashScopeClient.AsChatClient(testCase.RequestModel.Model); + + // Act + var response = client.GetStreamingResponseAsync( + testCase.RequestModel.Input.Messages!.Select(m => new ChatMessage { RawRepresentation = m }), + new ChatOptions + { + AdditionalProperties = new AdditionalPropertiesDictionary + { + { "raw", testCase.RequestModel.Parameters } + } + }); + var responseText = new StringBuilder(); + await foreach (var chatResponseUpdate in response) + { + responseText.Append(chatResponseUpdate.Text); + } + + // Assert + _ = dashScopeClient.Received().GetTextCompletionStreamAsync( + Arg.Is>(m + => m.IsEquivalent(testCase.RequestModel)), + Arg.Any()); + Assert.Equal(testCase.ResponseModel.Output.Choices![0].Message.Content, responseText.ToString()); + } + [Fact] public async Task ChatClient_TextCompletion_SuccessAsync() { @@ -43,8 +79,8 @@ public async Task ChatClient_TextCompletion_SuccessAsync() // Assert _ = dashScopeClient.Received().GetTextCompletionAsync( - Arg.Is>( - m => m.IsEquivalent(testCase.RequestModel)), + Arg.Is>(m + => m.IsEquivalent(testCase.RequestModel)), Arg.Any()); Assert.Equal(testCase.ResponseModel.Output.Choices![0].Message.Content, response.Messages[0].Text); } @@ -90,8 +126,8 @@ public async Task ChatClient_TextCompletionStream_SuccessAsync() // Assert _ = dashScopeClient.Received().GetTextCompletionStreamAsync( - Arg.Is>( - m => m.IsEquivalent(testCase.RequestModel)), + Arg.Is>(m + => m.IsEquivalent(testCase.RequestModel)), Arg.Any()); Assert.Equal(testCase.ResponseModel.Output.Choices![0].Message.Content, text.ToString()); } diff --git a/test/Cnblogs.DashScope.AI.UnitTests/Cnblogs.DashScope.AI.UnitTests.csproj b/test/Cnblogs.DashScope.AI.UnitTests/Cnblogs.DashScope.AI.UnitTests.csproj index 514c2c0..063acd8 100644 --- a/test/Cnblogs.DashScope.AI.UnitTests/Cnblogs.DashScope.AI.UnitTests.csproj +++ b/test/Cnblogs.DashScope.AI.UnitTests/Cnblogs.DashScope.AI.UnitTests.csproj @@ -1,31 +1,32 @@  - - net8.0 - enable - enable - false - + + net8.0 + enable + enable + false + true + - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - - - + + + - - - - + + + + diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/Cnblogs.DashScope.Sdk.UnitTests.csproj b/test/Cnblogs.DashScope.Sdk.UnitTests/Cnblogs.DashScope.Sdk.UnitTests.csproj index 11240e0..cd35c5f 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/Cnblogs.DashScope.Sdk.UnitTests.csproj +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/Cnblogs.DashScope.Sdk.UnitTests.csproj @@ -1,7 +1,6 @@ - net6.0 false true @@ -13,7 +12,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/ErrorTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/ErrorTests.cs index 3f3d9b5..afb4ce6 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/ErrorTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/ErrorTests.cs @@ -92,9 +92,9 @@ public async Task Error_OpenAiCompatibleError_ExceptionAsync() var (client, _) = await Sut.GetTestClientAsync(false, testCase); // Act - var act = async () => await client.UploadFileAsync( - Snapshots.File.TestFile.OpenRead(), - Snapshots.File.TestFile.Name, + var act = async () => await client.OpenAiCompatibleUploadFileAsync( + Snapshots.OpenAiCompatibleFile.TestFile.OpenRead(), + Snapshots.OpenAiCompatibleFile.TestFile.Name, "other"); // Assert diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs index 5a9dac0..1d336fc 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/FileSerializationTests.cs @@ -1,5 +1,5 @@ -using Cnblogs.DashScope.Tests.Shared.Utils; - +using Cnblogs.DashScope.Core; +using Cnblogs.DashScope.Tests.Shared.Utils; using NSubstitute; namespace Cnblogs.DashScope.Sdk.UnitTests; @@ -15,11 +15,19 @@ public async Task File_Upload_SuccessAsync() var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); // Act - var task = await client.UploadFileAsync(Snapshots.File.TestFile.OpenRead(), Snapshots.File.TestFile.Name); + var task = await client.UploadFilesAsync( + "file-extract", + new[] + { + new DashScopeUploadFileInput(Snapshots.File.TestFile.OpenRead(), Snapshots.File.TestFile.Name), + new DashScopeUploadFileInput(Snapshots.File.TestImage.OpenRead(), Snapshots.File.TestImage.Name) + }); // Assert handler.Received().MockSend( - Arg.Is(r => r.RequestUri!.AbsolutePath == "/compatible-mode/v1/files"), + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && ("/api/v1" + r.RequestUri!.PathAndQuery) == testCase.GetRequestPathAndQuery(sse)), Arg.Any()); Assert.Equivalent(testCase.ResponseModel, task); } @@ -33,12 +41,13 @@ public async Task File_Get_SuccessAsync() var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); // Act - var task = await client.GetFileAsync(testCase.ResponseModel.Id); + var task = await client.GetFileAsync(testCase.ResponseModel.Data.FileId); // Assert handler.Received().MockSend( - Arg.Is( - r => r.RequestUri!.AbsolutePath == "/compatible-mode/v1/files/" + testCase.ResponseModel.Id.Value), + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && ("/api/v1" + r.RequestUri!.PathAndQuery) == testCase.GetRequestPathAndQuery(sse)), Arg.Any()); Assert.Equivalent(testCase.ResponseModel, task); } @@ -48,13 +57,18 @@ public async Task File_List_SuccessAsync() { // Arrange const bool sse = false; - var testCase = Snapshots.File.ListFileNoSse; - var (client, _) = await Sut.GetTestClientAsync(sse, testCase); + var testCase = Snapshots.File.ListFilesNoSse; + var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); // Act - var list = await client.ListFilesAsync(); + var list = await client.ListFilesAsync(1, 2); // Assert + handler.Received().MockSend( + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && ("/api/v1" + r.RequestUri!.PathAndQuery) == testCase.GetRequestPathAndQuery(sse)), + Arg.Any()); Assert.Equivalent(testCase.ResponseModel, list); } @@ -67,12 +81,13 @@ public async Task File_Delete_SuccessAsync() var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); // Act - var task = await client.DeleteFileAsync(testCase.ResponseModel.Id); + var task = await client.DeleteFileAsync("file-fe-5d5eb068893f4b5e8551ada4"); // Assert handler.Received().MockSend( - Arg.Is( - r => r.RequestUri!.AbsolutePath == "/compatible-mode/v1/files/" + testCase.ResponseModel.Id.Value), + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && ("/api/v1" + r.RequestUri!.PathAndQuery) == testCase.GetRequestPathAndQuery(sse)), Arg.Any()); Assert.Equivalent(testCase.ResponseModel, task); } diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs index aac5cdd..c6facfd 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs @@ -45,7 +45,10 @@ public async Task MultimodalGeneration_Sse_SuccessAsync( // Assert handler.Received().MockSend( - Arg.Is(m => Checkers.IsJsonEquivalent(m.Content!, testCase.GetRequestJson(sse))), + Arg.Is(m + => m.Headers.Accept.ToString() == "text/event-stream" + && m.Headers.GetValues("X-DashScope-SSE").First() == "enable" + && Checkers.IsJsonEquivalent(m.Content!, testCase.GetRequestJson(sse))), Arg.Any()); Assert.All(outputs.SkipLast(1), x => Assert.Equal("null", x.Output.Choices[0].FinishReason)); Assert.Equal(testCase.ResponseModel.Output.Choices[0].Message.Content[0].Text, message.ToString()); @@ -85,6 +88,7 @@ ModelResponse>> SseData { Snapshots.MultimodalGeneration.VlSse, Snapshots.MultimodalGeneration.AudioSse, + Snapshots.MultimodalGeneration.AudioCaptionSse, Snapshots.MultimodalGeneration.OcrSse, Snapshots.MultimodalGeneration.VideoSse, Snapshots.MultimodalGeneration.OssVideoSse diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/OpenAiCompatibleFileSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/OpenAiCompatibleFileSerializationTests.cs new file mode 100644 index 0000000..95439e8 --- /dev/null +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/OpenAiCompatibleFileSerializationTests.cs @@ -0,0 +1,94 @@ +using Cnblogs.DashScope.Tests.Shared.Utils; +using NSubstitute; + +namespace Cnblogs.DashScope.Sdk.UnitTests; + +public class OpenAiCompatibleFileSerializationTests +{ + [Fact] + public async Task OpenAiFile_Upload_SuccessAsync() + { + // Arrange + const bool sse = false; + var testCase = Snapshots.OpenAiCompatibleFile.UploadFileCompatibleNoSse; + var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); + + // Act + var task = await client.OpenAiCompatibleUploadFileAsync( + Snapshots.OpenAiCompatibleFile.TestFile.OpenRead(), + Snapshots.OpenAiCompatibleFile.TestFile.Name); + + // Assert + handler.Received().MockSend( + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && r.RequestUri!.PathAndQuery == testCase.GetRequestPathAndQuery(sse)), + Arg.Any()); + Assert.Equivalent(testCase.ResponseModel, task); + } + + [Fact] + public async Task OpenAiFile_Get_SuccessAsync() + { + // Arrange + const bool sse = false; + var testCase = Snapshots.OpenAiCompatibleFile.GetFileCompatibleNoSse; + var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); + + // Act + var task = await client.OpenAiCompatibleGetFileAsync(testCase.ResponseModel.Id); + + // Assert + handler.Received().MockSend( + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && r.RequestUri!.PathAndQuery == testCase.GetRequestPathAndQuery(sse)), + Arg.Any()); + Assert.Equivalent(testCase.ResponseModel, task); + } + + [Fact] + public async Task OpenAiFile_List_SuccessAsync() + { + // Arrange + const bool sse = false; + var testCase = Snapshots.OpenAiCompatibleFile.ListFileCompatibleNoSse; + var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); + + // Act + var list = await client.OpenAiCompatibleListFilesAsync( + "file-fe-e457d4773c3f4c9fbfadffaf", + 3, + "20250101", + "20251101", + "file-extract"); + + // Assert + handler.Received().MockSend( + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && r.RequestUri!.PathAndQuery == testCase.GetRequestPathAndQuery(sse)), + Arg.Any()); + Assert.Equivalent(testCase.ResponseModel, list); + } + + [Fact] + public async Task OpenAiFile_Delete_SuccessAsync() + { + // Arrange + const bool sse = false; + var testCase = Snapshots.OpenAiCompatibleFile.DeleteFileCompatibleNoSse; + var (client, handler) = await Sut.GetTestClientAsync(sse, testCase); + + // Act + var task = await client.OpenAiCompatibleDeleteFileAsync(testCase.ResponseModel.Id); + + // Assert + handler.Received().MockSend( + Arg.Is(r + => r.Method == testCase.GetRequestMethod(sse) + && r.RequestUri!.PathAndQuery == testCase.GetRequestPathAndQuery(sse)), + Arg.Any()); + Assert.Equivalent(testCase.ResponseModel, task); + } +} diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/TextChatMessageContentJsonConvertorTests.cs new file mode 100644 index 0000000..fa4a99f --- /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" }, "auto"); + + // 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..87f9c7a 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/TextGenerationSerializationTests.cs @@ -220,12 +220,14 @@ public async Task ConversationCompletion_DeepResearchSse_SuccessAsync( Snapshots.TextGeneration.MessageFormat.SingleMessageIncremental, Snapshots.TextGeneration.MessageFormat.SingleMessageReasoningIncremental, Snapshots.TextGeneration.MessageFormat.SingleMessageWebSearchIncremental, - Snapshots.TextGeneration.MessageFormat.SingleMessageWithToolsIncremental); + Snapshots.TextGeneration.MessageFormat.SingleMessageWithToolsIncremental, + Snapshots.TextGeneration.MessageFormat.SingleMessageWithCodeInterpreterIncremental); 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.Sdk.UnitTests/UploadSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/UploadSerializationTests.cs index b53b069..7f77974 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/UploadSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/UploadSerializationTests.cs @@ -29,7 +29,7 @@ public async Task Upload_GetPolicy_SuccessAsync() public async Task Upload_SubmitFileForm_SuccessAsync() { // Arrange - var file = Snapshots.File.TestImage; + var file = Snapshots.OpenAiCompatibleFile.TestImage; var policy = Snapshots.Upload.GetPolicyNoSse.ResponseModel; var testCase = Snapshots.Upload.UploadTemporaryFileNoSse; var (client, handler) = await Sut.GetTestClientAsync(new HttpResponseMessage(HttpStatusCode.NoContent)); @@ -52,7 +52,7 @@ public async Task Upload_GetOssLinkDirectly_SuccessAsync() { // Arrange const bool sse = false; - var file = Snapshots.File.TestImage; + var file = Snapshots.OpenAiCompatibleFile.TestImage; var policyCase = Snapshots.Upload.GetPolicyNoSse; var testCase = Snapshots.Upload.UploadTemporaryFileNoSse; var (client, handler) = await Sut.GetTestClientAsync(sse, policyCase); @@ -74,7 +74,7 @@ public async Task Upload_GetOssLinkDirectly_SuccessAsync() public async Task Upload_GetPolicyFailed_ThrowsAsync() { // Arrange - var file = Snapshots.File.TestImage; + var file = Snapshots.OpenAiCompatibleFile.TestImage; var (client, _) = await Sut.GetTestClientAsync( new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent("null") }); diff --git a/test/Cnblogs.DashScope.Tests.Shared/Cnblogs.DashScope.Tests.Shared.csproj b/test/Cnblogs.DashScope.Tests.Shared/Cnblogs.DashScope.Tests.Shared.csproj index f4a861c..62e5330 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Cnblogs.DashScope.Tests.Shared.csproj +++ b/test/Cnblogs.DashScope.Tests.Shared/Cnblogs.DashScope.Tests.Shared.csproj @@ -1,7 +1,6 @@ - net6.0 enable enable false @@ -9,7 +8,7 @@ - + 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/RawHttpData/delete-file-compatible-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.request.header.txt new file mode 100644 index 0000000..0d3b51c --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.request.header.txt @@ -0,0 +1,6 @@ +DELETE /compatible-mode/v1/files/file-fe-d5c0ea9110bd47afb0505f43 HTTP/1.1 +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.body.txt new file mode 100644 index 0000000..8623bcd --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.body.txt @@ -0,0 +1 @@ +{"id":"file-fe-d5c0ea9110bd47afb0505f43","object":"file","deleted":true} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.header.txt new file mode 100644 index 0000000..46d225f --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-compatible-nosse.response.header.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +x-request-id: 49bfe5eb-b1e3-43fe-8689-d930a0bd2427 +content-type: application/json +content-length: 72 +req-cost-time: 549 +req-arrive-time: 1764499740121 +resp-start-time: 1764499740670 +x-envoy-upstream-service-time: 549 +date: Sun, 30 Nov 2025 10:49:00 GMT +server: istio-envoy diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.request.header.txt index 4f671b2..92043fc 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.request.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.request.header.txt @@ -1,4 +1,4 @@ -DELETE /api/v1/files/a4f34423-d413-4530-b167-b5180394f2ce HTTP/1.1 +DELETE /api/v1/files/file-fe-5d5eb068893f4b5e8551ada4 HTTP/1.1 Accept: */* Cache-Control: no-cache Host: dashscope.aliyuncs.com diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.body.txt index f9cb602..146e441 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.body.txt @@ -1 +1 @@ -{"object":"file","deleted":true,"id":"file-fe-qBKjZKfTx64R9oYmwyovNHBH"} +{"request_id":"df35151c-0df6-4cad-9912-83ebf8c633a4"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.header.txt index 134a7f3..2ec839d 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/delete-file-nosse.response.header.txt @@ -1,12 +1,9 @@ HTTP/1.1 200 OK -x-request-id: 3817b00a-0e6d-90cd-ada4-14a468185a59 -content-type: application/json;charset=UTF-8 -date: Wed, 10 Jul 2024 04:29:31 GMT -req-cost-time: 566 -req-arrive-time: 1720585771814 -resp-start-time: 1720585772380 -x-envoy-upstream-service-time: 565 -content-encoding: gzip -vary: Accept-Encoding +content-type: application/json +content-length: 53 +req-cost-time: 843 +req-arrive-time: 1764501039838 +resp-start-time: 1764501040681 +x-envoy-upstream-service-time: 834 +date: Sun, 30 Nov 2025 11:10:40 GMT server: istio-envoy -transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.request.header.txt new file mode 100644 index 0000000..4580970 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.request.header.txt @@ -0,0 +1,6 @@ +GET /compatible-mode/v1/files/file-fe-d5c0ea9110bd47afb0505f43 HTTP/1.1 +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.body.txt new file mode 100644 index 0000000..ba9d7a6 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.body.txt @@ -0,0 +1 @@ +{"id":"file-fe-d5c0ea9110bd47afb0505f43","object":"file","bytes":1314,"filename":"file1.txt","purpose":"file-extract","status":"processed","created_at":1761480070} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.header.txt new file mode 100644 index 0000000..6ba197b --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-compatible-nosse.response.header.txt @@ -0,0 +1,12 @@ +HTTP/1.1 200 OK +x-request-id: a5c36afb-16a5-4f01-81a9-4001b2e0f206 +content-type: application/json +req-cost-time: 94 +req-arrive-time: 1764499203790 +resp-start-time: 1764499203885 +x-envoy-upstream-service-time: 93 +content-encoding: gzip +vary: Accept-Encoding +date: Sun, 30 Nov 2025 10:40:03 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.request.header.txt index 88f0217..1073e2b 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.request.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.request.header.txt @@ -1,4 +1,4 @@ -GET /api/v1/files/6f87e744-aaff-409c-b596-1b851554bd6d HTTP/1.1 +GET /api/v1/files/file-fe-5d5eb068893f4b5e8551ada4 HTTP/1.1 Accept: */* Cache-Control: no-cache Host: dashscope.aliyuncs.com diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.body.txt index 8fdf9c4..5a5c625 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.body.txt @@ -1 +1 @@ -{"id":"file-fe-qBKjZKfTx64R9oYmwyovNHBH","object":"file","bytes":6,"created_at":1720582024,"filename":"test1.txt","purpose":"file-extract","status":"processed"} +{"data":{"id":193306194,"name":"test2.txt","description":"","purpose":"file-extract","size":7,"md5":"Td5oBnUd0kfuUGMd0zd5Ig==","region":"cn-beijing","file_id":"file-fe-5d5eb068893f4b5e8551ada4","url":"http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/2f2e1a67-e94c-4a00-8e86-6d51d94a8f75/test2.txt?Expires=1764587166&OSSAccessKeyId=STS.NZN1pTGUrUxPQhPveYcaRAYMg&Signature=k7llO9KgcPkeuQicUgwaGR2w%2F4A%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5n7esrgqopT4rq7U07hkmUMb%2B5%2BrpzmhTz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb4wUfE3vB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEBon2HKn5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK%2F1R8LZDUvdUGoABihW5mNOnIIV1zRuddC7OZ50nQwm%2F23uV3Y8WICHL1WbbOqhjkgUlqZdQhBVk4pNlL2QoziUCeSwPJa6o2mvoch%2BIVx5OA48YB9pBa2KYLl%2BAkVNzQVU%2FLtOR2bQQWQwIwtKwJEP107ZOFwwQgLOapGkrawOc7PEdg0Brr71x%2BrEgAA%3D%3D","user_id":"1493478651020171","api_key_id":"67516","gmt_create":"2025-11-30 18:42:45"},"request_id":"1f05e2cb-de12-46f1-872c-ab70aa15e87f"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.header.txt index 8cf0266..457bd0e 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-file-nosse.response.header.txt @@ -1,12 +1,11 @@ HTTP/1.1 200 OK -x-request-id: 7564ffca-ae8f-9b85-908b-c33ab076a364 -content-type: application/json;charset=UTF-8 -date: Wed, 10 Jul 2024 04:12:14 GMT -req-cost-time: 138 -req-arrive-time: 1720584734533 -resp-start-time: 1720584734671 -x-envoy-upstream-service-time: 137 +content-type: application/json +req-cost-time: 50 +req-arrive-time: 1764500766449 +resp-start-time: 1764500766499 +x-envoy-upstream-service-time: 44 content-encoding: gzip vary: Accept-Encoding +date: Sun, 30 Nov 2025 11:06:06 GMT server: istio-envoy transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-upload-policy-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-upload-policy-nosse.response.body.txt index fec31a7..82c0f7b 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-upload-policy-nosse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/get-upload-policy-nosse.response.body.txt @@ -1 +1 @@ -{"data":{"policy":"eyJleHBpcmF0aW9uIjoiMjAyNS0wNy0xMlQxMjoxMDoyNC40ODhaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA3Mzc0MTgyNF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJkYXNoc2NvcGUtaW5zdGFudFwvNTJhZmUwNzdmYjQ4MjVjNmQ3NDQxMTc1OGNiMWFiOThcLzIwMjUtMDctMTJcL2I3NDRmNGY4LTFhOWMtOWM2Yi05NTBkLTBkMzI3ZTMzMWYyZiJdLHsiYnVja2V0IjoiZGFzaHNjb3BlLWZpbGUtbWdyIn0seyJ4LW9zcy1vYmplY3QtYWNsIjoicHJpdmF0ZSJ9LHsieC1vc3MtZm9yYmlkLW92ZXJ3cml0ZSI6InRydWUifV19","signature":"n3dNX/aD3+WAly0QgzsURfiIk00=","upload_dir":"dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-07-12/b744f4f8-1a9c-9c6b-950d-0d327e331f2f","upload_host":"https://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com","expire_in_seconds":300,"max_file_size_mb":1024,"capacity_limit_mb":999999999,"oss_access_key_id":"LTAI5tG7vL6zZFFbuNrkCjdo","x_oss_object_acl":"private","x_oss_forbid_overwrite":"true"},"request_id":"b744f4f8-1a9c-9c6b-950d-0d327e331f2f"} +{"data":{"policy":"eyJleHBpcmF0aW9uIjoiMjAyNS0wNy0xMlQxMjoxMDoyNC40ODhaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA3Mzc0MTgyNF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJkYXNoc2NvcGUtaW5zdGFudFwvNTJhZmUwNzdmYjQ4MjVjNmQ3NDQxMTc1OGNiMWFiOThcLzIwMjUtMDctMTJcL2I3NDRmNGY4LTFhOWMtOWM2Yi05NTBkLTBkMzI3ZTMzMWYyZiJdLHsiYnVja2V0IjoiZGFzaHNjb3BlLWZpbGUtbWdyIn0seyJ4LW9zcy1vYmplY3QtYWNsIjoicHJpdmF0ZSJ9LHsieC1vc3MtZm9yYmlkLW92ZXJ3cml0ZSI6InRydWUifV19","signature":"n3dNX/aD3+WAly0QgzsURfiIk00=","upload_dir":"dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-07-12/b744f4f8-1a9c-9c6b-950d-0d327e331f2f","upload_host":"https://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com","expire_in_seconds":300,"max_file_size_mb":1024,"capacity_limit_mb":999999999,"oss_access_key_id":"accessKeyId","x_oss_object_acl":"private","x_oss_forbid_overwrite":"true"},"request_id":"b744f4f8-1a9c-9c6b-950d-0d327e331f2f"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.request.header.txt new file mode 100644 index 0000000..61b8dd2 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.request.header.txt @@ -0,0 +1,6 @@ +GET /compatible-mode/v1/files?after=file-fe-e457d4773c3f4c9fbfadffaf&limit=3&create_after=20250101&create_before=20251101&purpose=file-extract HTTP/1.1 +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.body.txt new file mode 100644 index 0000000..5075987 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.body.txt @@ -0,0 +1 @@ +{"object":"list","data":[{"id":"file-fe-d5c0ea9110bd47afb0505f43","object":"file","bytes":1314,"filename":"file1.txt","purpose":"file-extract","status":"processed","created_at":1761480070}],"has_more":false} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.header.txt new file mode 100644 index 0000000..071972e --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-compatible-nosse.response.header.txt @@ -0,0 +1,11 @@ +HTTP/1.1 200 OK +x-request-id: 5f796ece-c45b-4cda-94fb-b291ef925bc9 +content-type: application/json +req-cost-time: 200 +req-arrive-time: 1764485805115 +resp-start-time: 1764485805315 +x-envoy-upstream-service-time: 199 +content-encoding: gzip +vary: Accept-Encoding +date: Sun, 30 Nov 2025 06:56:44 GMT +server: istio-envoy diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.request.header.txt index 83d65b4..55d1d9b 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.request.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.request.header.txt @@ -1,4 +1,4 @@ -GET /api/v1/files?page_no=1&page_size=1 HTTP/1.1 +GET /api/v1/files?page_no=1&page_size=2 HTTP/1.1 Accept: */* Cache-Control: no-cache Host: dashscope.aliyuncs.com diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.body.txt index cc2b25e..3e7d550 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.body.txt @@ -1 +1 @@ -{"object":"list","has_more":false,"data":[{"id":"file-fe-qBKjZKfTx64R9oYmwyovNHBH","object":"file","bytes":6,"created_at":1720582024,"filename":"test1.txt","purpose":"file-extract","status":"processed"},{"id":"file-fe-WTTG89tIUTd4ByqP3K48R3bn","object":"file","bytes":6,"created_at":1720535665,"filename":"test1.txt","purpose":"file-extract","status":"processed"}]} +{"data":{"total":15,"files":[{"id":193320717,"name":"test2.txt","description":"test2","size":7,"md5":"Td5oBnUd0kfuUGMd0zd5Ig==","region":"cn-beijing","file_id":"311d3340-1f9b-487c-bd35-481cd5a23855","url":"http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/311d3340-1f9b-487c-bd35-481cd5a23855/test2.txt?Expires=1764589060&OSSAccessKeyId=STS.NYUDr5WyfdYrXTGudSB7jFWoH&Signature=xa4nsjmZTcHaOfTXvv3cR7C7vNE%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5rgD8iBuqZH05uZWnL2kWQGTrhGqZLEqjz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb40tLcHrB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEJk7zIan5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK2zRlCpDUvdUGoABOb8SEKtMfDU%2FVSF1VJ7hLFCQxC%2F7xuFKTrsxyK2UMGsgt18A%2Fe8Tq%2BtiBoH94pv%2B1hhJ34C6qRwLdhbhIN31TmYd%2FV9xPc9QFJYZuh49xUXFeapxnuaM8KxoXVc94FBlIy9ccDi%2FG%2BOyNbrtISjtNhJXehcJQ66tMTRxYIVeUA4gAA%3D%3D","user_id":"1493478651020171","api_key_id":"67516","gmt_create":"2025-11-30 19:37:33"},{"id":193320718,"name":"test1.txt","description":"test1","size":6,"md5":"2wbHjR4kz3CKFM6BybYX7A==","region":"cn-beijing","file_id":"8a95f76a-8d79-4d8d-b372-7d0a72493680","url":"http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/8a95f76a-8d79-4d8d-b372-7d0a72493680/test1.txt?Expires=1764589060&OSSAccessKeyId=STS.NYUDr5WyfdYrXTGudSB7jFWoH&Signature=1Gi%2FeChAGNPeFQj2oLszyd7M3ng%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5rgD8iBuqZH05uZWnL2kWQGTrhGqZLEqjz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb40tLcHrB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEJk7zIan5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK2zRlCpDUvdUGoABOb8SEKtMfDU%2FVSF1VJ7hLFCQxC%2F7xuFKTrsxyK2UMGsgt18A%2Fe8Tq%2BtiBoH94pv%2B1hhJ34C6qRwLdhbhIN31TmYd%2FV9xPc9QFJYZuh49xUXFeapxnuaM8KxoXVc94FBlIy9ccDi%2FG%2BOyNbrtISjtNhJXehcJQ66tMTRxYIVeUA4gAA%3D%3D","user_id":"1493478651020171","api_key_id":"67516","gmt_create":"2025-11-30 19:37:33"}],"page_size":2,"page_no":1},"request_id":"d4bdceb3-0a87-4025-b226-afb13c5a3442"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.header.txt index 4c0de6c..15ea150 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/list-files-nosse.response.header.txt @@ -1,12 +1,11 @@ HTTP/1.1 200 OK -x-request-id: 7b920d81-2d97-965e-835d-f3ca7ee25ae4 -content-type: application/json;charset=UTF-8 -date: Wed, 10 Jul 2024 04:24:18 GMT -req-cost-time: 159 -req-arrive-time: 1720585458676 -resp-start-time: 1720585458835 -x-envoy-upstream-service-time: 158 +content-type: application/json +req-cost-time: 148 +req-arrive-time: 1764502659968 +resp-start-time: 1764502660116 +x-envoy-upstream-service-time: 139 content-encoding: gzip vary: Accept-Encoding +date: Sun, 30 Nov 2025 11:37:39 GMT server: istio-envoy transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.body.json new file mode 100644 index 0000000..09eb08a --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.body.json @@ -0,0 +1,16 @@ +{ + "model": "qwen3-omni-30b-a3b-captioner", + "input":{ + "messages":[ + { + "role": "user", + "content": [ + {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"} + ] + } + ] + }, + "parameters": { + "incremental_output": true + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.header.txt new file mode 100644 index 0000000..b667086 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.request.header.txt @@ -0,0 +1,9 @@ +POST /api/v1/services/aigc/multimodal-generation/generation HTTP/1.1 +Accept: text/event-stream +X-DashScope-SSE: enable +Content-Type: application/json +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 441 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.body.txt new file mode 100644 index 0000000..5cca174 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.body.txt @@ -0,0 +1,2215 @@ +id:1 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":161,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":1,"input_tokens":160,"output_tokens_details":{"text_tokens":1}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:2 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" audio"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":162,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":2,"input_tokens":160,"output_tokens_details":{"text_tokens":2}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:3 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" clip"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":163,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":3,"input_tokens":160,"output_tokens_details":{"text_tokens":3}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:4 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":164,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":4,"input_tokens":160,"output_tokens_details":{"text_tokens":4}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:5 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":165,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":5,"input_tokens":160,"output_tokens_details":{"text_tokens":5}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:6 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" short"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":166,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":6,"input_tokens":160,"output_tokens_details":{"text_tokens":6}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:7 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":167,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":7,"input_tokens":160,"output_tokens_details":{"text_tokens":7}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:8 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" moderately"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":168,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":8,"input_tokens":160,"output_tokens_details":{"text_tokens":8}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:9 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" clear"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":169,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":9,"input_tokens":160,"output_tokens_details":{"text_tokens":9}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:10 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" recording"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":170,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":10,"input_tokens":160,"output_tokens_details":{"text_tokens":10}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:11 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"—"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":171,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":11,"input_tokens":160,"output_tokens_details":{"text_tokens":11}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:12 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"approximately"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":172,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":12,"input_tokens":160,"output_tokens_details":{"text_tokens":12}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:13 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" "}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":173,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":13,"input_tokens":160,"output_tokens_details":{"text_tokens":13}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:14 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"6"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":174,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":14,"input_tokens":160,"output_tokens_details":{"text_tokens":14}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:15 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" seconds"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":175,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":15,"input_tokens":160,"output_tokens_details":{"text_tokens":15}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:16 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" in"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":176,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":16,"input_tokens":160,"output_tokens_details":{"text_tokens":16}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:17 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" length"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":177,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":17,"input_tokens":160,"output_tokens_details":{"text_tokens":17}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:18 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"—"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":178,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":18,"input_tokens":160,"output_tokens_details":{"text_tokens":18}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:19 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"set"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":179,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":19,"input_tokens":160,"output_tokens_details":{"text_tokens":19}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:20 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" in"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":180,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":20,"input_tokens":160,"output_tokens_details":{"text_tokens":20}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:21 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":181,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":21,"input_tokens":160,"output_tokens_details":{"text_tokens":21}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:22 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" small"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":182,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":22,"input_tokens":160,"output_tokens_details":{"text_tokens":22}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:23 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":183,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":23,"input_tokens":160,"output_tokens_details":{"text_tokens":23}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:24 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rever"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":184,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":24,"input_tokens":160,"output_tokens_details":{"text_tokens":24}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:25 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ber"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":185,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":25,"input_tokens":160,"output_tokens_details":{"text_tokens":25}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:26 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ant"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":186,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":26,"input_tokens":160,"output_tokens_details":{"text_tokens":26}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:27 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" indoor"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":187,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":27,"input_tokens":160,"output_tokens_details":{"text_tokens":27}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:28 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" space"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":188,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":28,"input_tokens":160,"output_tokens_details":{"text_tokens":28}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:29 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":189,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":29,"input_tokens":160,"output_tokens_details":{"text_tokens":29}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:30 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" likely"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":190,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":30,"input_tokens":160,"output_tokens_details":{"text_tokens":30}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:31 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":191,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":31,"input_tokens":160,"output_tokens_details":{"text_tokens":31}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:32 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" private"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":192,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":32,"input_tokens":160,"output_tokens_details":{"text_tokens":32}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:33 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" home"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":193,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":33,"input_tokens":160,"output_tokens_details":{"text_tokens":33}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:34 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" or"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":194,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":34,"input_tokens":160,"output_tokens_details":{"text_tokens":34}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:35 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" office"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":195,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":35,"input_tokens":160,"output_tokens_details":{"text_tokens":35}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:36 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":196,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":36,"input_tokens":160,"output_tokens_details":{"text_tokens":36}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:37 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":197,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":37,"input_tokens":160,"output_tokens_details":{"text_tokens":37}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:38 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" dominant"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":198,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":38,"input_tokens":160,"output_tokens_details":{"text_tokens":38}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:39 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" feature"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":199,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":39,"input_tokens":160,"output_tokens_details":{"text_tokens":39}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:40 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":200,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":40,"input_tokens":160,"output_tokens_details":{"text_tokens":40}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:41 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":201,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":41,"input_tokens":160,"output_tokens_details":{"text_tokens":41}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:42 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" series"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":202,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":42,"input_tokens":160,"output_tokens_details":{"text_tokens":42}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:43 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":203,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":43,"input_tokens":160,"output_tokens_details":{"text_tokens":43}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:44 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" loud"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":204,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":44,"input_tokens":160,"output_tokens_details":{"text_tokens":44}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:45 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":205,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":45,"input_tokens":160,"output_tokens_details":{"text_tokens":45}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:46 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" metallic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":206,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":46,"input_tokens":160,"output_tokens_details":{"text_tokens":46}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:47 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":207,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":47,"input_tokens":160,"output_tokens_details":{"text_tokens":47}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:48 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rhyth"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":208,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":48,"input_tokens":160,"output_tokens_details":{"text_tokens":48}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:49 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"mic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":209,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":49,"input_tokens":160,"output_tokens_details":{"text_tokens":49}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:50 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":210,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":50,"input_tokens":160,"output_tokens_details":{"text_tokens":50}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:51 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":211,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":51,"input_tokens":160,"output_tokens_details":{"text_tokens":51}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:52 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" noises"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":212,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":52,"input_tokens":160,"output_tokens_details":{"text_tokens":52}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:53 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":213,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":53,"input_tokens":160,"output_tokens_details":{"text_tokens":53}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:54 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" occurring"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":214,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":54,"input_tokens":160,"output_tokens_details":{"text_tokens":54}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:55 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" at"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":215,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":55,"input_tokens":160,"output_tokens_details":{"text_tokens":55}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:56 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":216,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":56,"input_tokens":160,"output_tokens_details":{"text_tokens":56}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:57 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" regular"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":217,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":57,"input_tokens":160,"output_tokens_details":{"text_tokens":57}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:58 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tempo"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":218,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":58,"input_tokens":160,"output_tokens_details":{"text_tokens":58}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:59 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":219,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":59,"input_tokens":160,"output_tokens_details":{"text_tokens":59}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:60 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" about"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":220,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":60,"input_tokens":160,"output_tokens_details":{"text_tokens":60}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:61 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" "}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":221,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":61,"input_tokens":160,"output_tokens_details":{"text_tokens":61}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:62 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"1"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":222,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":62,"input_tokens":160,"output_tokens_details":{"text_tokens":62}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:63 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"2"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":223,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":63,"input_tokens":160,"output_tokens_details":{"text_tokens":63}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:64 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"0"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":224,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":64,"input_tokens":160,"output_tokens_details":{"text_tokens":64}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:65 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" beats"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":225,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":65,"input_tokens":160,"output_tokens_details":{"text_tokens":65}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:66 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" per"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":226,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":66,"input_tokens":160,"output_tokens_details":{"text_tokens":66}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:67 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" minute"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":227,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":67,"input_tokens":160,"output_tokens_details":{"text_tokens":67}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:68 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":228,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":68,"input_tokens":160,"output_tokens_details":{"text_tokens":68}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:69 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" with"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":229,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":69,"input_tokens":160,"output_tokens_details":{"text_tokens":69}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:70 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" each"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":230,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":70,"input_tokens":160,"output_tokens_details":{"text_tokens":70}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:71 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" blow"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":231,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":71,"input_tokens":160,"output_tokens_details":{"text_tokens":71}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:72 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" exhibiting"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":232,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":72,"input_tokens":160,"output_tokens_details":{"text_tokens":72}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:73 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":233,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":73,"input_tokens":160,"output_tokens_details":{"text_tokens":73}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:74 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" sharp"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":234,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":74,"input_tokens":160,"output_tokens_details":{"text_tokens":74}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:75 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":235,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":75,"input_tokens":160,"output_tokens_details":{"text_tokens":75}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:76 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" high"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":236,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":76,"input_tokens":160,"output_tokens_details":{"text_tokens":76}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:77 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"-frequency"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":237,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":77,"input_tokens":160,"output_tokens_details":{"text_tokens":77}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:78 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" attack"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":238,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":78,"input_tokens":160,"output_tokens_details":{"text_tokens":78}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:79 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":239,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":79,"input_tokens":160,"output_tokens_details":{"text_tokens":79}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:80 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" brief"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":240,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":80,"input_tokens":160,"output_tokens_details":{"text_tokens":80}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:81 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" metallic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":241,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":81,"input_tokens":160,"output_tokens_details":{"text_tokens":81}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:82 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" resonance"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":242,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":82,"input_tokens":160,"output_tokens_details":{"text_tokens":82}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:83 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":243,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":83,"input_tokens":160,"output_tokens_details":{"text_tokens":83}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:84 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" These"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":244,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":84,"input_tokens":160,"output_tokens_details":{"text_tokens":84}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:85 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" impacts"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":245,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":85,"input_tokens":160,"output_tokens_details":{"text_tokens":85}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:86 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" are"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":246,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":86,"input_tokens":160,"output_tokens_details":{"text_tokens":86}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:87 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" highly"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":247,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":87,"input_tokens":160,"output_tokens_details":{"text_tokens":87}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:88 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" regular"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":248,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":88,"input_tokens":160,"output_tokens_details":{"text_tokens":88}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:89 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":249,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":89,"input_tokens":160,"output_tokens_details":{"text_tokens":89}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:90 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" suggesting"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":250,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":90,"input_tokens":160,"output_tokens_details":{"text_tokens":90}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:91 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":251,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":91,"input_tokens":160,"output_tokens_details":{"text_tokens":91}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:92 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" use"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":252,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":92,"input_tokens":160,"output_tokens_details":{"text_tokens":92}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:93 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":253,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":93,"input_tokens":160,"output_tokens_details":{"text_tokens":93}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:94 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":254,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":94,"input_tokens":160,"output_tokens_details":{"text_tokens":94}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:95 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" power"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":255,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":95,"input_tokens":160,"output_tokens_details":{"text_tokens":95}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:96 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tool"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":256,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":96,"input_tokens":160,"output_tokens_details":{"text_tokens":96}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:97 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" such"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":257,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":97,"input_tokens":160,"output_tokens_details":{"text_tokens":97}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:98 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" as"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":258,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":98,"input_tokens":160,"output_tokens_details":{"text_tokens":98}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:99 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":259,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":99,"input_tokens":160,"output_tokens_details":{"text_tokens":99}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:100 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" pne"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":260,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":100,"input_tokens":160,"output_tokens_details":{"text_tokens":100}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:101 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"umatic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":261,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":101,"input_tokens":160,"output_tokens_details":{"text_tokens":101}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:102 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" nail"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":262,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":102,"input_tokens":160,"output_tokens_details":{"text_tokens":102}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:103 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" gun"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":263,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":103,"input_tokens":160,"output_tokens_details":{"text_tokens":103}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:104 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" or"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":264,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":104,"input_tokens":160,"output_tokens_details":{"text_tokens":104}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:105 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" electric"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":265,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":105,"input_tokens":160,"output_tokens_details":{"text_tokens":105}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:106 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":266,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":106,"input_tokens":160,"output_tokens_details":{"text_tokens":106}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:107 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":267,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":107,"input_tokens":160,"output_tokens_details":{"text_tokens":107}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:108 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rather"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":268,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":108,"input_tokens":160,"output_tokens_details":{"text_tokens":108}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:109 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" than"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":269,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":109,"input_tokens":160,"output_tokens_details":{"text_tokens":109}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:110 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":270,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":110,"input_tokens":160,"output_tokens_details":{"text_tokens":110}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:111 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hand"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":271,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":111,"input_tokens":160,"output_tokens_details":{"text_tokens":111}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:112 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"-held"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":272,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":112,"input_tokens":160,"output_tokens_details":{"text_tokens":112}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:113 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":273,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":113,"input_tokens":160,"output_tokens_details":{"text_tokens":113}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:114 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":".\n\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":274,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":114,"input_tokens":160,"output_tokens_details":{"text_tokens":114}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:115 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"Overlay"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":275,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":115,"input_tokens":160,"output_tokens_details":{"text_tokens":115}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:116 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":276,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":116,"input_tokens":160,"output_tokens_details":{"text_tokens":116}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:117 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" this"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":277,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":117,"input_tokens":160,"output_tokens_details":{"text_tokens":117}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:118 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" mechanical"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":278,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":118,"input_tokens":160,"output_tokens_details":{"text_tokens":118}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:119 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" sound"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":279,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":119,"input_tokens":160,"output_tokens_details":{"text_tokens":119}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:120 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":280,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":120,"input_tokens":160,"output_tokens_details":{"text_tokens":120}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:121 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":281,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":121,"input_tokens":160,"output_tokens_details":{"text_tokens":121}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:122 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" single"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":282,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":122,"input_tokens":160,"output_tokens_details":{"text_tokens":122}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:123 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" male"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":283,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":123,"input_tokens":160,"output_tokens_details":{"text_tokens":123}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:124 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" voice"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":284,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":124,"input_tokens":160,"output_tokens_details":{"text_tokens":124}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:125 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":285,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":125,"input_tokens":160,"output_tokens_details":{"text_tokens":125}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:126 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" speaking"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":286,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":126,"input_tokens":160,"output_tokens_details":{"text_tokens":126}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:127 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" in"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":287,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":127,"input_tokens":160,"output_tokens_details":{"text_tokens":127}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:128 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" standard"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":288,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":128,"input_tokens":160,"output_tokens_details":{"text_tokens":128}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:129 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" Mandarin"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":289,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":129,"input_tokens":160,"output_tokens_details":{"text_tokens":129}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:130 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" Chinese"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":290,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":130,"input_tokens":160,"output_tokens_details":{"text_tokens":130}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:131 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":291,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":131,"input_tokens":160,"output_tokens_details":{"text_tokens":131}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:132 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" delivers"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":292,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":132,"input_tokens":160,"output_tokens_details":{"text_tokens":132}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:133 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":293,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":133,"input_tokens":160,"output_tokens_details":{"text_tokens":133}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:134 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" brief"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":294,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":134,"input_tokens":160,"output_tokens_details":{"text_tokens":134}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:135 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":295,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":135,"input_tokens":160,"output_tokens_details":{"text_tokens":135}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:136 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" ex"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":296,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":136,"input_tokens":160,"output_tokens_details":{"text_tokens":136}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:137 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"asper"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":297,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":137,"input_tokens":160,"output_tokens_details":{"text_tokens":137}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:138 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ated"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":298,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":138,"input_tokens":160,"output_tokens_details":{"text_tokens":138}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:139 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" complaint"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":299,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":139,"input_tokens":160,"output_tokens_details":{"text_tokens":139}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:140 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":300,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":140,"input_tokens":160,"output_tokens_details":{"text_tokens":140}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:141 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" His"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":301,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":141,"input_tokens":160,"output_tokens_details":{"text_tokens":141}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:142 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tone"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":302,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":142,"input_tokens":160,"output_tokens_details":{"text_tokens":142}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:143 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":303,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":143,"input_tokens":160,"output_tokens_details":{"text_tokens":143}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:144 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" weary"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":304,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":144,"input_tokens":160,"output_tokens_details":{"text_tokens":144}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:145 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":305,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":145,"input_tokens":160,"output_tokens_details":{"text_tokens":145}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:146 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" resigned"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":306,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":146,"input_tokens":160,"output_tokens_details":{"text_tokens":146}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:147 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":307,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":147,"input_tokens":160,"output_tokens_details":{"text_tokens":147}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:148 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" marked"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":308,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":148,"input_tokens":160,"output_tokens_details":{"text_tokens":148}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:149 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" by"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":309,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":149,"input_tokens":160,"output_tokens_details":{"text_tokens":149}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:150 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":310,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":150,"input_tokens":160,"output_tokens_details":{"text_tokens":150}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:151 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" sigh"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":311,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":151,"input_tokens":160,"output_tokens_details":{"text_tokens":151}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:152 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" at"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":312,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":152,"input_tokens":160,"output_tokens_details":{"text_tokens":152}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:153 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":313,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":153,"input_tokens":160,"output_tokens_details":{"text_tokens":153}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:154 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" start"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":314,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":154,"input_tokens":160,"output_tokens_details":{"text_tokens":154}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:155 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":315,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":155,"input_tokens":160,"output_tokens_details":{"text_tokens":155}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:156 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":316,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":156,"input_tokens":160,"output_tokens_details":{"text_tokens":156}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:157 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" drawn"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":317,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":157,"input_tokens":160,"output_tokens_details":{"text_tokens":157}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:158 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"-out"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":318,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":158,"input_tokens":160,"output_tokens_details":{"text_tokens":158}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:159 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":319,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":159,"input_tokens":160,"output_tokens_details":{"text_tokens":159}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:160 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" slightly"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":320,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":160,"input_tokens":160,"output_tokens_details":{"text_tokens":160}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:161 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" wh"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":321,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":161,"input_tokens":160,"output_tokens_details":{"text_tokens":161}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:162 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ining"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":322,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":162,"input_tokens":160,"output_tokens_details":{"text_tokens":162}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:163 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" int"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":323,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":163,"input_tokens":160,"output_tokens_details":{"text_tokens":163}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:164 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"onation"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":324,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":164,"input_tokens":160,"output_tokens_details":{"text_tokens":164}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:165 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":325,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":165,"input_tokens":160,"output_tokens_details":{"text_tokens":165}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:166 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":326,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":166,"input_tokens":160,"output_tokens_details":{"text_tokens":166}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:167 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" spoken"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":327,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":167,"input_tokens":160,"output_tokens_details":{"text_tokens":167}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:168 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" phrase"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":328,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":168,"input_tokens":160,"output_tokens_details":{"text_tokens":168}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:169 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":329,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":169,"input_tokens":160,"output_tokens_details":{"text_tokens":169}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:170 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" “"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":330,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":170,"input_tokens":160,"output_tokens_details":{"text_tokens":170}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:171 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"哎"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":331,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":171,"input_tokens":160,"output_tokens_details":{"text_tokens":171}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:172 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"呀"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":332,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":172,"input_tokens":160,"output_tokens_details":{"text_tokens":172}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:173 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":333,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":173,"input_tokens":160,"output_tokens_details":{"text_tokens":173}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:174 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"这样"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":334,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":174,"input_tokens":160,"output_tokens_details":{"text_tokens":174}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:175 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"我还"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":335,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":175,"input_tokens":160,"output_tokens_details":{"text_tokens":175}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:176 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"怎么"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":336,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":176,"input_tokens":160,"output_tokens_details":{"text_tokens":176}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:177 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"安静"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":337,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":177,"input_tokens":160,"output_tokens_details":{"text_tokens":177}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:178 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"工作"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":338,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":178,"input_tokens":160,"output_tokens_details":{"text_tokens":178}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:179 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"啊"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":339,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":179,"input_tokens":160,"output_tokens_details":{"text_tokens":179}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:180 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"?”"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":340,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":180,"input_tokens":160,"output_tokens_details":{"text_tokens":180}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:181 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" (“"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":341,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":181,"input_tokens":160,"output_tokens_details":{"text_tokens":181}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:182 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"A"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":342,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":182,"input_tokens":160,"output_tokens_details":{"text_tokens":182}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:183 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"iy"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":343,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":183,"input_tokens":160,"output_tokens_details":{"text_tokens":183}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:184 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ah"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":344,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":184,"input_tokens":160,"output_tokens_details":{"text_tokens":184}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:185 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":345,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":185,"input_tokens":160,"output_tokens_details":{"text_tokens":185}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:186 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" how"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":346,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":186,"input_tokens":160,"output_tokens_details":{"text_tokens":186}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:187 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" can"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":347,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":187,"input_tokens":160,"output_tokens_details":{"text_tokens":187}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:188 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" I"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":348,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":188,"input_tokens":160,"output_tokens_details":{"text_tokens":188}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:189 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" work"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":349,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":189,"input_tokens":160,"output_tokens_details":{"text_tokens":189}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:190 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" quietly"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":350,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":190,"input_tokens":160,"output_tokens_details":{"text_tokens":190}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:191 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" like"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":351,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":191,"input_tokens":160,"output_tokens_details":{"text_tokens":191}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:192 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" this"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":352,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":192,"input_tokens":160,"output_tokens_details":{"text_tokens":192}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:193 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"?”"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":353,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":193,"input_tokens":160,"output_tokens_details":{"text_tokens":193}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:194 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"),"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":354,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":194,"input_tokens":160,"output_tokens_details":{"text_tokens":194}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:195 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" directly"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":355,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":195,"input_tokens":160,"output_tokens_details":{"text_tokens":195}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:196 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" addresses"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":356,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":196,"input_tokens":160,"output_tokens_details":{"text_tokens":196}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:197 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":357,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":197,"input_tokens":160,"output_tokens_details":{"text_tokens":197}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:198 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" disruptive"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":358,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":198,"input_tokens":160,"output_tokens_details":{"text_tokens":198}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:199 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" nature"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":359,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":199,"input_tokens":160,"output_tokens_details":{"text_tokens":199}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:200 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":360,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":200,"input_tokens":160,"output_tokens_details":{"text_tokens":200}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:201 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":361,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":201,"input_tokens":160,"output_tokens_details":{"text_tokens":201}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:202 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":362,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":202,"input_tokens":160,"output_tokens_details":{"text_tokens":202}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:203 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":363,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":203,"input_tokens":160,"output_tokens_details":{"text_tokens":203}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:204 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":364,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":204,"input_tokens":160,"output_tokens_details":{"text_tokens":204}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:205 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" indicating"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":365,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":205,"input_tokens":160,"output_tokens_details":{"text_tokens":205}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:206 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":366,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":206,"input_tokens":160,"output_tokens_details":{"text_tokens":206}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:207 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" personal"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":367,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":207,"input_tokens":160,"output_tokens_details":{"text_tokens":207}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:208 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":368,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":208,"input_tokens":160,"output_tokens_details":{"text_tokens":208}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:209 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" informal"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":369,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":209,"input_tokens":160,"output_tokens_details":{"text_tokens":209}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:210 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" relationship"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":370,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":210,"input_tokens":160,"output_tokens_details":{"text_tokens":210}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:211 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" with"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":371,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":211,"input_tokens":160,"output_tokens_details":{"text_tokens":211}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:212 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":372,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":212,"input_tokens":160,"output_tokens_details":{"text_tokens":212}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:213 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" person"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":373,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":213,"input_tokens":160,"output_tokens_details":{"text_tokens":213}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:214 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" or"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":374,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":214,"input_tokens":160,"output_tokens_details":{"text_tokens":214}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:215 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" people"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":375,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":215,"input_tokens":160,"output_tokens_details":{"text_tokens":215}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:216 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" responsible"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":376,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":216,"input_tokens":160,"output_tokens_details":{"text_tokens":216}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:217 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" for"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":377,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":217,"input_tokens":160,"output_tokens_details":{"text_tokens":217}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:218 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":378,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":218,"input_tokens":160,"output_tokens_details":{"text_tokens":218}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:219 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" noise"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":379,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":219,"input_tokens":160,"output_tokens_details":{"text_tokens":219}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:220 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":".\n\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":380,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":220,"input_tokens":160,"output_tokens_details":{"text_tokens":220}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:221 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":381,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":221,"input_tokens":160,"output_tokens_details":{"text_tokens":221}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:222 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" recording"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":382,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":222,"input_tokens":160,"output_tokens_details":{"text_tokens":222}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:223 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":383,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":223,"input_tokens":160,"output_tokens_details":{"text_tokens":223}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:224 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":384,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":224,"input_tokens":160,"output_tokens_details":{"text_tokens":224}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:225 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" moderate"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":385,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":225,"input_tokens":160,"output_tokens_details":{"text_tokens":225}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:226 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" quality"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":386,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":226,"input_tokens":160,"output_tokens_details":{"text_tokens":226}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:227 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":387,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":227,"input_tokens":160,"output_tokens_details":{"text_tokens":227}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:228 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" with"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":388,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":228,"input_tokens":160,"output_tokens_details":{"text_tokens":228}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:229 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" both"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":389,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":229,"input_tokens":160,"output_tokens_details":{"text_tokens":229}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:230 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":390,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":230,"input_tokens":160,"output_tokens_details":{"text_tokens":230}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:231 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" voice"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":391,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":231,"input_tokens":160,"output_tokens_details":{"text_tokens":231}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:232 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":392,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":232,"input_tokens":160,"output_tokens_details":{"text_tokens":232}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:233 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":393,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":233,"input_tokens":160,"output_tokens_details":{"text_tokens":233}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:234 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":394,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":234,"input_tokens":160,"output_tokens_details":{"text_tokens":234}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:235 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" clear"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":395,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":235,"input_tokens":160,"output_tokens_details":{"text_tokens":235}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:236 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":396,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":236,"input_tokens":160,"output_tokens_details":{"text_tokens":236}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:237 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" intellig"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":397,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":237,"input_tokens":160,"output_tokens_details":{"text_tokens":237}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:238 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ible"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":398,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":238,"input_tokens":160,"output_tokens_details":{"text_tokens":238}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:239 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":399,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":239,"input_tokens":160,"output_tokens_details":{"text_tokens":239}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:240 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" though"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":400,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":240,"input_tokens":160,"output_tokens_details":{"text_tokens":240}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:241 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":401,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":241,"input_tokens":160,"output_tokens_details":{"text_tokens":241}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:242 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" metallic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":402,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":242,"input_tokens":160,"output_tokens_details":{"text_tokens":242}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:243 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" sounds"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":403,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":243,"input_tokens":160,"output_tokens_details":{"text_tokens":243}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:244 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" are"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":404,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":244,"input_tokens":160,"output_tokens_details":{"text_tokens":244}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:245 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" slightly"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":405,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":245,"input_tokens":160,"output_tokens_details":{"text_tokens":245}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:246 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" distorted"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":406,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":246,"input_tokens":160,"output_tokens_details":{"text_tokens":246}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:247 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":407,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":247,"input_tokens":160,"output_tokens_details":{"text_tokens":247}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:248 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" clipped"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":408,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":248,"input_tokens":160,"output_tokens_details":{"text_tokens":248}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:249 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" at"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":409,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":249,"input_tokens":160,"output_tokens_details":{"text_tokens":249}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:250 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" their"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":410,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":250,"input_tokens":160,"output_tokens_details":{"text_tokens":250}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:251 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" lou"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":411,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":251,"input_tokens":160,"output_tokens_details":{"text_tokens":251}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:252 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"dest"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":412,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":252,"input_tokens":160,"output_tokens_details":{"text_tokens":252}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:253 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" peaks"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":413,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":253,"input_tokens":160,"output_tokens_details":{"text_tokens":253}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:254 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":414,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":254,"input_tokens":160,"output_tokens_details":{"text_tokens":254}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:255 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" There"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":415,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":255,"input_tokens":160,"output_tokens_details":{"text_tokens":255}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:256 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":416,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":256,"input_tokens":160,"output_tokens_details":{"text_tokens":256}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:257 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":417,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":257,"input_tokens":160,"output_tokens_details":{"text_tokens":257}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:258 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" faint"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":418,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":258,"input_tokens":160,"output_tokens_details":{"text_tokens":258}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:259 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":419,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":259,"input_tokens":160,"output_tokens_details":{"text_tokens":259}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:260 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" consistent"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":420,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":260,"input_tokens":160,"output_tokens_details":{"text_tokens":260}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:261 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" electronic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":421,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":261,"input_tokens":160,"output_tokens_details":{"text_tokens":261}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:262 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" his"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":422,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":262,"input_tokens":160,"output_tokens_details":{"text_tokens":262}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:263 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"s"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":423,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":263,"input_tokens":160,"output_tokens_details":{"text_tokens":263}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:264 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" throughout"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":424,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":264,"input_tokens":160,"output_tokens_details":{"text_tokens":264}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:265 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":425,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":265,"input_tokens":160,"output_tokens_details":{"text_tokens":265}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:266 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":426,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":266,"input_tokens":160,"output_tokens_details":{"text_tokens":266}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:267 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":427,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":267,"input_tokens":160,"output_tokens_details":{"text_tokens":267}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:268 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" low"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":428,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":268,"input_tokens":160,"output_tokens_details":{"text_tokens":268}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:269 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"-frequency"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":429,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":269,"input_tokens":160,"output_tokens_details":{"text_tokens":269}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:270 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hum"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":430,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":270,"input_tokens":160,"output_tokens_details":{"text_tokens":270}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:271 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"—"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":431,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":271,"input_tokens":160,"output_tokens_details":{"text_tokens":271}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:272 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"pot"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":432,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":272,"input_tokens":160,"output_tokens_details":{"text_tokens":272}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:273 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"entially"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":433,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":273,"input_tokens":160,"output_tokens_details":{"text_tokens":273}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:274 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" from"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":434,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":274,"input_tokens":160,"output_tokens_details":{"text_tokens":274}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:275 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" nearby"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":435,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":275,"input_tokens":160,"output_tokens_details":{"text_tokens":275}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:276 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" electrical"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":436,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":276,"input_tokens":160,"output_tokens_details":{"text_tokens":276}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:277 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" equipment"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":437,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":277,"input_tokens":160,"output_tokens_details":{"text_tokens":277}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:278 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"—"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":438,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":278,"input_tokens":160,"output_tokens_details":{"text_tokens":278}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:279 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"can"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":439,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":279,"input_tokens":160,"output_tokens_details":{"text_tokens":279}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:280 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" be"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":440,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":280,"input_tokens":160,"output_tokens_details":{"text_tokens":280}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:281 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" detected"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":441,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":281,"input_tokens":160,"output_tokens_details":{"text_tokens":281}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:282 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":442,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":282,"input_tokens":160,"output_tokens_details":{"text_tokens":282}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:283 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":443,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":283,"input_tokens":160,"output_tokens_details":{"text_tokens":283}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:284 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" room"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":444,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":284,"input_tokens":160,"output_tokens_details":{"text_tokens":284}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:285 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"’s"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":445,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":285,"input_tokens":160,"output_tokens_details":{"text_tokens":285}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:286 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" ac"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":446,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":286,"input_tokens":160,"output_tokens_details":{"text_tokens":286}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:287 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"oust"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":447,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":287,"input_tokens":160,"output_tokens_details":{"text_tokens":287}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:288 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ics"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":448,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":288,"input_tokens":160,"output_tokens_details":{"text_tokens":288}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:289 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" are"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":449,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":289,"input_tokens":160,"output_tokens_details":{"text_tokens":289}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:290 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" “"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":450,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":290,"input_tokens":160,"output_tokens_details":{"text_tokens":290}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:291 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"live"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":451,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":291,"input_tokens":160,"output_tokens_details":{"text_tokens":291}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:292 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":",”"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":452,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":292,"input_tokens":160,"output_tokens_details":{"text_tokens":292}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:293 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" with"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":453,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":293,"input_tokens":160,"output_tokens_details":{"text_tokens":293}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:294 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" short"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":454,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":294,"input_tokens":160,"output_tokens_details":{"text_tokens":294}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:295 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":455,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":295,"input_tokens":160,"output_tokens_details":{"text_tokens":295}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:296 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" bright"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":456,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":296,"input_tokens":160,"output_tokens_details":{"text_tokens":296}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:297 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rever"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":457,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":297,"input_tokens":160,"output_tokens_details":{"text_tokens":297}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:298 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ber"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":458,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":298,"input_tokens":160,"output_tokens_details":{"text_tokens":298}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:299 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ation"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":459,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":299,"input_tokens":160,"output_tokens_details":{"text_tokens":299}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:300 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tails"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":460,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":300,"input_tokens":160,"output_tokens_details":{"text_tokens":300}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:301 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" on"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":461,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":301,"input_tokens":160,"output_tokens_details":{"text_tokens":301}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:302 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" both"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":462,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":302,"input_tokens":160,"output_tokens_details":{"text_tokens":302}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:303 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":463,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":303,"input_tokens":160,"output_tokens_details":{"text_tokens":303}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:304 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" voice"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":464,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":304,"input_tokens":160,"output_tokens_details":{"text_tokens":304}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:305 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":465,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":305,"input_tokens":160,"output_tokens_details":{"text_tokens":305}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:306 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hammer"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":466,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":306,"input_tokens":160,"output_tokens_details":{"text_tokens":306}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:307 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":467,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":307,"input_tokens":160,"output_tokens_details":{"text_tokens":307}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:308 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":468,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":308,"input_tokens":160,"output_tokens_details":{"text_tokens":308}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:309 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" suggesting"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":469,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":309,"input_tokens":160,"output_tokens_details":{"text_tokens":309}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:310 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" hard"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":470,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":310,"input_tokens":160,"output_tokens_details":{"text_tokens":310}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:311 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" surfaces"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":471,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":311,"input_tokens":160,"output_tokens_details":{"text_tokens":311}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:312 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":472,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":312,"input_tokens":160,"output_tokens_details":{"text_tokens":312}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:313 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":473,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":313,"input_tokens":160,"output_tokens_details":{"text_tokens":313}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:314 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" small"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":474,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":314,"input_tokens":160,"output_tokens_details":{"text_tokens":314}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:315 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":475,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":315,"input_tokens":160,"output_tokens_details":{"text_tokens":315}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:316 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" enclosed"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":476,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":316,"input_tokens":160,"output_tokens_details":{"text_tokens":316}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:317 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" space"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":477,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":317,"input_tokens":160,"output_tokens_details":{"text_tokens":317}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:318 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":".\n\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":478,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":318,"input_tokens":160,"output_tokens_details":{"text_tokens":318}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:319 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"No"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":479,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":319,"input_tokens":160,"output_tokens_details":{"text_tokens":319}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:320 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" other"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":480,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":320,"input_tokens":160,"output_tokens_details":{"text_tokens":320}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:321 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" human"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":481,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":321,"input_tokens":160,"output_tokens_details":{"text_tokens":321}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:322 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" voices"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":482,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":322,"input_tokens":160,"output_tokens_details":{"text_tokens":322}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:323 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":483,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":323,"input_tokens":160,"output_tokens_details":{"text_tokens":323}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:324 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" background"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":484,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":324,"input_tokens":160,"output_tokens_details":{"text_tokens":324}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:325 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" conversations"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":485,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":325,"input_tokens":160,"output_tokens_details":{"text_tokens":325}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:326 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":486,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":326,"input_tokens":160,"output_tokens_details":{"text_tokens":326}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:327 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" or"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":487,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":327,"input_tokens":160,"output_tokens_details":{"text_tokens":327}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:328 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" environmental"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":488,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":328,"input_tokens":160,"output_tokens_details":{"text_tokens":328}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:329 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" cues"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":489,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":329,"input_tokens":160,"output_tokens_details":{"text_tokens":329}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:330 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" are"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":490,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":330,"input_tokens":160,"output_tokens_details":{"text_tokens":330}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:331 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" present"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":491,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":331,"input_tokens":160,"output_tokens_details":{"text_tokens":331}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:332 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":492,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":332,"input_tokens":160,"output_tokens_details":{"text_tokens":332}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:333 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" reinforcing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":493,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":333,"input_tokens":160,"output_tokens_details":{"text_tokens":333}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:334 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":494,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":334,"input_tokens":160,"output_tokens_details":{"text_tokens":334}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:335 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" impression"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":495,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":335,"input_tokens":160,"output_tokens_details":{"text_tokens":335}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:336 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":496,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":336,"input_tokens":160,"output_tokens_details":{"text_tokens":336}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:337 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":497,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":337,"input_tokens":160,"output_tokens_details":{"text_tokens":337}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:338 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" solitary"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":498,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":338,"input_tokens":160,"output_tokens_details":{"text_tokens":338}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:339 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":499,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":339,"input_tokens":160,"output_tokens_details":{"text_tokens":339}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:340 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" private"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":500,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":340,"input_tokens":160,"output_tokens_details":{"text_tokens":340}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:341 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" setting"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":501,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":341,"input_tokens":160,"output_tokens_details":{"text_tokens":341}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:342 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":502,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":342,"input_tokens":160,"output_tokens_details":{"text_tokens":342}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:343 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" The"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":503,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":343,"input_tokens":160,"output_tokens_details":{"text_tokens":343}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:344 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" overall"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":504,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":344,"input_tokens":160,"output_tokens_details":{"text_tokens":344}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:345 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" atmosphere"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":505,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":345,"input_tokens":160,"output_tokens_details":{"text_tokens":345}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:346 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":506,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":346,"input_tokens":160,"output_tokens_details":{"text_tokens":346}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:347 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" one"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":507,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":347,"input_tokens":160,"output_tokens_details":{"text_tokens":347}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:348 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":508,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":348,"input_tokens":160,"output_tokens_details":{"text_tokens":348}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:349 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" mild"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":509,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":349,"input_tokens":160,"output_tokens_details":{"text_tokens":349}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:350 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" frustration"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":510,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":350,"input_tokens":160,"output_tokens_details":{"text_tokens":350}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:351 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":511,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":351,"input_tokens":160,"output_tokens_details":{"text_tokens":351}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:352 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" resignation"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":512,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":352,"input_tokens":160,"output_tokens_details":{"text_tokens":352}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:353 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":513,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":353,"input_tokens":160,"output_tokens_details":{"text_tokens":353}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:354 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" with"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":514,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":354,"input_tokens":160,"output_tokens_details":{"text_tokens":354}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:355 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":515,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":355,"input_tokens":160,"output_tokens_details":{"text_tokens":355}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:356 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" speaker"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":516,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":356,"input_tokens":160,"output_tokens_details":{"text_tokens":356}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:357 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"’s"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":517,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":357,"input_tokens":160,"output_tokens_details":{"text_tokens":357}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:358 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tone"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":518,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":358,"input_tokens":160,"output_tokens_details":{"text_tokens":358}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:359 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":519,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":359,"input_tokens":160,"output_tokens_details":{"text_tokens":359}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:360 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":520,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":360,"input_tokens":160,"output_tokens_details":{"text_tokens":360}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:361 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" content"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":521,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":361,"input_tokens":160,"output_tokens_details":{"text_tokens":361}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:362 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":522,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":362,"input_tokens":160,"output_tokens_details":{"text_tokens":362}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:363 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" his"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":523,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":363,"input_tokens":160,"output_tokens_details":{"text_tokens":363}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:364 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" complaint"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":524,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":364,"input_tokens":160,"output_tokens_details":{"text_tokens":364}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:365 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" expressing"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":525,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":365,"input_tokens":160,"output_tokens_details":{"text_tokens":365}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:366 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":526,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":366,"input_tokens":160,"output_tokens_details":{"text_tokens":366}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:367 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" classic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":527,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":367,"input_tokens":160,"output_tokens_details":{"text_tokens":367}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:368 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" annoyance"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":528,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":368,"input_tokens":160,"output_tokens_details":{"text_tokens":368}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:369 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":529,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":369,"input_tokens":160,"output_tokens_details":{"text_tokens":369}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:370 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" being"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":530,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":370,"input_tokens":160,"output_tokens_details":{"text_tokens":370}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:371 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" unable"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":531,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":371,"input_tokens":160,"output_tokens_details":{"text_tokens":371}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:372 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" to"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":532,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":372,"input_tokens":160,"output_tokens_details":{"text_tokens":372}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:373 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" concentrate"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":533,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":373,"input_tokens":160,"output_tokens_details":{"text_tokens":373}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:374 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" or"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":534,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":374,"input_tokens":160,"output_tokens_details":{"text_tokens":374}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:375 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" work"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":535,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":375,"input_tokens":160,"output_tokens_details":{"text_tokens":375}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:376 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" in"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":536,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":376,"input_tokens":160,"output_tokens_details":{"text_tokens":376}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:377 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" peace"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":537,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":377,"input_tokens":160,"output_tokens_details":{"text_tokens":377}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:378 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" due"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":538,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":378,"input_tokens":160,"output_tokens_details":{"text_tokens":378}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:379 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" to"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":539,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":379,"input_tokens":160,"output_tokens_details":{"text_tokens":379}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:380 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" disruptive"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":540,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":380,"input_tokens":160,"output_tokens_details":{"text_tokens":380}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:381 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":541,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":381,"input_tokens":160,"output_tokens_details":{"text_tokens":381}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:382 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" persistent"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":542,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":382,"input_tokens":160,"output_tokens_details":{"text_tokens":382}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:383 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" noise"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":543,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":383,"input_tokens":160,"output_tokens_details":{"text_tokens":383}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:384 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":".\n\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":544,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":384,"input_tokens":160,"output_tokens_details":{"text_tokens":384}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:385 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"In"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":545,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":385,"input_tokens":160,"output_tokens_details":{"text_tokens":385}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:386 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" summary"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":546,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":386,"input_tokens":160,"output_tokens_details":{"text_tokens":386}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:387 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":547,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":387,"input_tokens":160,"output_tokens_details":{"text_tokens":387}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:388 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":548,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":388,"input_tokens":160,"output_tokens_details":{"text_tokens":388}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:389 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" recording"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":549,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":389,"input_tokens":160,"output_tokens_details":{"text_tokens":389}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:390 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" captures"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":550,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":390,"input_tokens":160,"output_tokens_details":{"text_tokens":390}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:391 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":551,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":391,"input_tokens":160,"output_tokens_details":{"text_tokens":391}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:392 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" brief"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":552,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":392,"input_tokens":160,"output_tokens_details":{"text_tokens":392}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:393 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":553,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":393,"input_tokens":160,"output_tokens_details":{"text_tokens":393}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:394 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" personal"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":554,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":394,"input_tokens":160,"output_tokens_details":{"text_tokens":394}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:395 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" moment"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":555,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":395,"input_tokens":160,"output_tokens_details":{"text_tokens":395}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:396 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":556,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":396,"input_tokens":160,"output_tokens_details":{"text_tokens":396}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:397 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" complaint"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":557,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":397,"input_tokens":160,"output_tokens_details":{"text_tokens":397}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:398 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":":"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":558,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":398,"input_tokens":160,"output_tokens_details":{"text_tokens":398}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:399 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":559,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":399,"input_tokens":160,"output_tokens_details":{"text_tokens":399}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:400 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" Mandarin"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":560,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":400,"input_tokens":160,"output_tokens_details":{"text_tokens":400}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:401 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"-speaking"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":561,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":401,"input_tokens":160,"output_tokens_details":{"text_tokens":401}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:402 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" man"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":562,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":402,"input_tokens":160,"output_tokens_details":{"text_tokens":402}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:403 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":563,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":403,"input_tokens":160,"output_tokens_details":{"text_tokens":403}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:404 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" working"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":564,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":404,"input_tokens":160,"output_tokens_details":{"text_tokens":404}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:405 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" alone"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":565,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":405,"input_tokens":160,"output_tokens_details":{"text_tokens":405}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:406 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" in"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":566,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":406,"input_tokens":160,"output_tokens_details":{"text_tokens":406}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:407 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":567,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":407,"input_tokens":160,"output_tokens_details":{"text_tokens":407}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:408 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" quiet"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":568,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":408,"input_tokens":160,"output_tokens_details":{"text_tokens":408}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:409 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":569,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":409,"input_tokens":160,"output_tokens_details":{"text_tokens":409}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:410 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rever"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":570,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":410,"input_tokens":160,"output_tokens_details":{"text_tokens":410}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:411 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ber"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":571,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":411,"input_tokens":160,"output_tokens_details":{"text_tokens":411}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:412 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"ant"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":572,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":412,"input_tokens":160,"output_tokens_details":{"text_tokens":412}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:413 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" indoor"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":573,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":413,"input_tokens":160,"output_tokens_details":{"text_tokens":413}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:414 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" space"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":574,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":414,"input_tokens":160,"output_tokens_details":{"text_tokens":414}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:415 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":575,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":415,"input_tokens":160,"output_tokens_details":{"text_tokens":415}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:416 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" is"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":576,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":416,"input_tokens":160,"output_tokens_details":{"text_tokens":416}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:417 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" interrupted"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":577,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":417,"input_tokens":160,"output_tokens_details":{"text_tokens":417}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:418 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" by"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":578,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":418,"input_tokens":160,"output_tokens_details":{"text_tokens":418}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:419 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":579,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":419,"input_tokens":160,"output_tokens_details":{"text_tokens":419}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:420 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" rhyth"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":580,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":420,"input_tokens":160,"output_tokens_details":{"text_tokens":420}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:421 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"mic"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":581,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":421,"input_tokens":160,"output_tokens_details":{"text_tokens":421}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:422 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" operation"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":582,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":422,"input_tokens":160,"output_tokens_details":{"text_tokens":422}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:423 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" of"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":583,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":423,"input_tokens":160,"output_tokens_details":{"text_tokens":423}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:424 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" a"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":584,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":424,"input_tokens":160,"output_tokens_details":{"text_tokens":424}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:425 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" power"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":585,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":425,"input_tokens":160,"output_tokens_details":{"text_tokens":425}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:426 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" tool"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":586,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":426,"input_tokens":160,"output_tokens_details":{"text_tokens":426}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:427 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":587,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":427,"input_tokens":160,"output_tokens_details":{"text_tokens":427}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:428 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" prompting"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":588,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":428,"input_tokens":160,"output_tokens_details":{"text_tokens":428}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:429 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" him"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":589,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":429,"input_tokens":160,"output_tokens_details":{"text_tokens":429}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:430 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" to"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":590,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":430,"input_tokens":160,"output_tokens_details":{"text_tokens":430}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:431 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" voice"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":591,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":431,"input_tokens":160,"output_tokens_details":{"text_tokens":431}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:432 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" his"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":592,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":432,"input_tokens":160,"output_tokens_details":{"text_tokens":432}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:433 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" frustration"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":593,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":433,"input_tokens":160,"output_tokens_details":{"text_tokens":433}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:434 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" at"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":594,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":434,"input_tokens":160,"output_tokens_details":{"text_tokens":434}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:435 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" the"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":595,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":435,"input_tokens":160,"output_tokens_details":{"text_tokens":435}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:436 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" disruption"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":596,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":436,"input_tokens":160,"output_tokens_details":{"text_tokens":436}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:437 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" to"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":597,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":437,"input_tokens":160,"output_tokens_details":{"text_tokens":437}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:438 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" his"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":598,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":438,"input_tokens":160,"output_tokens_details":{"text_tokens":438}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:439 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" peace"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":599,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":439,"input_tokens":160,"output_tokens_details":{"text_tokens":439}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:440 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" and"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":600,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":440,"input_tokens":160,"output_tokens_details":{"text_tokens":440}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:441 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":" productivity"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":601,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":441,"input_tokens":160,"output_tokens_details":{"text_tokens":441}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:442 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"."}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":602,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":442,"input_tokens":160,"output_tokens_details":{"text_tokens":442}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + +id:443 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":602,"input_tokens_details":{"audio_tokens":152,"text_tokens":8},"output_tokens":442,"input_tokens":160,"output_tokens_details":{"text_tokens":442}},"request_id":"5159c491-56f4-47a3-8197-0c81114424d8"} + diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.header.txt new file mode 100644 index 0000000..2339942 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-audio-caption-sse.response.header.txt @@ -0,0 +1,14 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers +x-request-id: 5159c491-56f4-47a3-8197-0c81114424d8 +content-type: text/event-stream;charset=UTF-8 +x-dashscope-call-gateway: true +x-dashscope-timeout: 298 +x-dashscope-finished: false +req-cost-time: 517 +req-arrive-time: 1764598677105 +resp-start-time: 1764598677622 +x-envoy-upstream-service-time: 510 +date: Mon, 01 Dec 2025 14:17:57 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.request.body.json new file mode 100644 index 0000000..099f90c --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.request.body.json @@ -0,0 +1,17 @@ +{ + "model": "qwen3-max-preview", + "input": { + "messages": [ + { + "role": "user", + "content": "123的21次方是多少?" + } + ] + }, + "parameters": { + "result_format": "message", + "enable_thinking": true, + "enable_code_interpreter": true, + "incremental_output": true + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.request.header.txt new file mode 100644 index 0000000..52b0b00 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-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: 394 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.body.txt new file mode 100644 index 0000000..58959c2 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.body.txt @@ -0,0 +1,280 @@ +id:1 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用户","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":284,"output_tokens":3,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":1},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:2 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"问","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":285,"output_tokens":4,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":2},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:3 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"的是","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":286,"output_tokens":5,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":3},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:4 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"123","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":289,"output_tokens":8,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":6},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:5 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"的21次方是多少","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":295,"output_tokens":14,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":12},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:6 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"。这是一个数学计算问题,","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":301,"output_tokens":20,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":18},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:7 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"我需要计算123","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":307,"output_tokens":26,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":24},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:8 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"^21的","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":311,"output_tokens":30,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":28},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:9 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"值。\n\n我可以使用代码计算器","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":317,"output_tokens":36,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":34},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:10 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"工具来计算这个","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":321,"output_tokens":40,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":38},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:11 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"大数。我需要","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":326,"output_tokens":45,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":43},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:12 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"调用code_interpreter函数","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":332,"output_tokens":51,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":49},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:13 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",传入计算","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":336,"output_tokens":55,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":53},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:14 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"123**","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":340,"output_tokens":59,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":57},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:15 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"21的Python代码。\n\n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":346,"output_tokens":65,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":63},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:16 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"让我准备这个函数调","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":351,"output_tokens":70,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":68},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:17 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用。","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":355,"output_tokens":74,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:18 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":364,"output_tokens":83,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:19 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":369,"output_tokens":88,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:20 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":373,"output_tokens":92,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:21 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":379,"output_tokens":98,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:22 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":383,"output_tokens":102,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:23 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":383,"output_tokens":102,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:24 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":383,"output_tokens":102,"input_tokens":281,"output_tokens_details":{"reasoning_tokens":69},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:25 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"用户","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":828,"output_tokens":105,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":70},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:26 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"询问","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":829,"output_tokens":106,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":71},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:27 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"1","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":830,"output_tokens":107,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":72},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:28 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"23的","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":833,"output_tokens":110,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":75},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:29 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"21次方是多少","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":838,"output_tokens":115,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":80},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:30 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",我使用代码","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":842,"output_tokens":119,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":84},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:31 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"计算器计算出了结果。结果","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":848,"output_tokens":125,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":90},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:32 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"是一个非常大的数字","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":852,"output_tokens":129,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":94},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:33 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":":7726","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":857,"output_tokens":134,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":99},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:34 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"936446","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":863,"output_tokens":140,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":105},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:35 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"654986","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":869,"output_tokens":146,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":111},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:36 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"565307","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":875,"output_tokens":152,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":117},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:37 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"347338","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":881,"output_tokens":158,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":123},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:38 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"803006","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":887,"output_tokens":164,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":129},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:39 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"152221","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":893,"output_tokens":170,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":135},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:40 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"1723\n\n","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":898,"output_tokens":175,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":140},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:41 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"我需要将这个","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":902,"output_tokens":179,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":144},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:42 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"结果清晰地呈现给","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":907,"output_tokens":184,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":149},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:43 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"12","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":913,"output_tokens":190,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:44 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"3的21次方","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":919,"output_tokens":196,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:45 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"是:\n\n772","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":924,"output_tokens":201,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:46 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"693644","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":930,"output_tokens":207,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:47 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"665498","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":936,"output_tokens":213,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:48 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"656530","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":942,"output_tokens":219,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:49 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"734733","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":948,"output_tokens":225,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:50 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"880300","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":954,"output_tokens":231,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:51 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"615222","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":960,"output_tokens":237,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:52 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"11723\n\n","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":966,"output_tokens":243,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:53 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"这是一个非常大的数字","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":970,"output_tokens":247,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:54 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":",共有42位数","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":976,"output_tokens":253,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:55 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"。","reasoning_content":"","role":"assistant"},"finish_reason":"null"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":977,"output_tokens":254,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + +id:56 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"stop"}],"tool_info":[{"code_interpreter":{"code":"123**21"},"type":"code_interpreter"}]},"usage":{"total_tokens":977,"output_tokens":254,"input_tokens":723,"output_tokens_details":{"reasoning_tokens":150},"plugins":{"code_interpreter":{"count":1}},"prompt_tokens_details":{"cached_tokens":0}},"request_id":"752a7de3-d3aa-4aeb-82ab-a8b08b41524b"} + diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.header.txt new file mode 100644 index 0000000..4a62628 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/single-generation-message-with-code-interpreter-sse.response.header.txt @@ -0,0 +1,14 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers +x-request-id: 752a7de3-d3aa-4aeb-82ab-a8b08b41524b +content-type: text/event-stream;charset=UTF-8 +x-dashscope-call-gateway: true +x-dashscope-timeout: 298 +x-dashscope-finished: false +req-cost-time: 901 +req-arrive-time: 1764771416660 +resp-start-time: 1764771417561 +x-envoy-upstream-service-time: 893 +date: Wed, 03 Dec 2025 14:16:57 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.body.txt new file mode 100644 index 0000000..640df95 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.body.txt @@ -0,0 +1,7 @@ +----------------------------124769516956446222138824 +Content-Disposition: form-data; name="file"; filename="1ef3db24-f499-44b0-a5df-1db496e7f22e" +<1ef3db24-f499-44b0-a5df-1db496e7f22e> +----------------------------124769516956446222138824 +Content-Disposition: form-data; name="purpose" +file-extract +----------------------------124769516956446222138824-- diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.header.txt new file mode 100644 index 0000000..318b370 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /compatible-mode/v1/files HTTP/1.1 +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Type: multipart/form-data; boundary=--------------------------124769516956446222138824 +Content-Length: 332 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.body.txt new file mode 100644 index 0000000..4b469fd --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.body.txt @@ -0,0 +1 @@ +{"id":"file-fe-5d5eb068893f4b5e8551ada4","object":"file","bytes":7,"filename":"test2.txt","purpose":"file-extract","status":"processed","created_at":1764499365} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.header.txt new file mode 100644 index 0000000..e0f7fa9 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-compatible-nosse.response.header.txt @@ -0,0 +1,12 @@ +HTTP/1.1 200 OK +x-request-id: 2f2e1a67-e94c-4a00-8e86-6d51d94a8f75 +content-type: application/json +req-cost-time: 574 +req-arrive-time: 1764499364785 +resp-start-time: 1764499365360 +x-envoy-upstream-service-time: 574 +content-encoding: gzip +vary: Accept-Encoding +date: Sun, 30 Nov 2025 10:42:45 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.request.header.txt index 40d8b49..86093e8 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.request.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.request.header.txt @@ -4,4 +4,5 @@ Cache-Control: no-cache Host: dashscope.aliyuncs.com Accept-Encoding: gzip, deflate, br Connection: keep-alive -Content-Type: multipart/form-data; +Content-Type: multipart/form-data; boundary=--------------------------077180496463466976744602 +Content-Length: 599 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.body.txt index 8fdf9c4..ac9098d 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.body.txt @@ -1 +1 @@ -{"id":"file-fe-qBKjZKfTx64R9oYmwyovNHBH","object":"file","bytes":6,"created_at":1720582024,"filename":"test1.txt","purpose":"file-extract","status":"processed"} +{"data":{"uploaded_files":[{"name":"test2.txt","file_id":"ed5a313b-3fdf-4cc9-a0b0-66664af692e1"}],"failed_uploads":[{"name":"test1.txt","code":"BadRequest.TooMany","message":"Out of number, <10> of <10> files has been uploaded."}]},"request_id":"982c4dc2-95a0-4fa5-982e-2732f5f9c011"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.header.txt index 99d5d08..fbe7475 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-file-nosse.response.header.txt @@ -1,12 +1,11 @@ HTTP/1.1 200 OK -x-request-id: 8ef1f38f-fc7b-90f9-bb09-1926c2675299 -content-type: application/json;charset=UTF-8 -date: Wed, 10 Jul 2024 03:27:04 GMT -req-cost-time: 346 -req-arrive-time: 1720582024232 -resp-start-time: 1720582024578 -x-envoy-upstream-service-time: 344 +content-type: application/json +req-cost-time: 392 +req-arrive-time: 1764502036427 +resp-start-time: 1764502036820 +x-envoy-upstream-service-time: 386 content-encoding: gzip vary: Accept-Encoding +date: Sun, 30 Nov 2025 11:27:16 GMT server: istio-envoy transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-temporary-file-nosse.request.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-temporary-file-nosse.request.body.txt index 11a3297..16d66ab 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-temporary-file-nosse.request.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/upload-temporary-file-nosse.request.body.txt @@ -1,7 +1,7 @@ --5aa22a67-eae4-4c54-8f62-c486fefd11a5 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=OSSAccessKeyId -LTAI5tG7vL6zZFFbuNrkCjdo +accessKeyId --5aa22a67-eae4-4c54-8f62-c486fefd11a5 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=policy diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/RequestSnapshot.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/RequestSnapshot.cs index cdd3ed8..19ef073 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/RequestSnapshot.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/RequestSnapshot.cs @@ -17,6 +17,12 @@ public string GetRequestJson(bool sse) public List GetRequestForm(bool sse) { var body = GetRequestBody(sse); + if (body.Contains("\r\n") == false) + { + // update CRLF + body = body.Replace("\n", "\r\n"); + } + var blocks = body .Split($"--{Boundary}", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries) .SkipLast(1) @@ -54,6 +60,20 @@ public string GetRequestBody(bool sse, string ext = "txt") { return File.ReadAllText(Path.Combine("RawHttpData", $"{GetSnapshotCaseName(sse)}.request.body.{ext}")); } + + public HttpMethod GetRequestMethod(bool sse) + { + var firstLine = + File.ReadAllLines(Path.Combine("RawHttpData", $"{GetSnapshotCaseName(sse)}.request.header.txt"))[0]; + return new HttpMethod(firstLine.Split(' ')[0]); + } + + public string GetRequestPathAndQuery(bool sse) + { + var firstLine = + File.ReadAllLines(Path.Combine("RawHttpData", $"{GetSnapshotCaseName(sse)}.request.header.txt"))[0]; + return firstLine.Split(' ')[1]; + } } public record RequestSnapshot(string Name, TResponse ResponseModel) : RequestSnapshot(Name) diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.Audio.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.Audio.cs new file mode 100644 index 0000000..633aa98 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.Audio.cs @@ -0,0 +1,168 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Tests.Shared.Utils; + +public static partial class Snapshots +{ + public static partial class MultimodalGeneration + { + public static readonly RequestSnapshot, + ModelResponse> + AudioNoSse = new( + "multimodal-generation-audio", + new ModelRequest + { + Model = "qwen-audio-turbo", + Input = new MultimodalInput + { + Messages = + new List + { + MultimodalMessage.System( + new List + { + MultimodalMessageContent.TextContent("You are a helpful assistant.") + }), + MultimodalMessage.User( + new List + { + MultimodalMessageContent.AudioContent( + "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), + MultimodalMessageContent.TextContent("这段音频在说什么,请用简短的语言回答") + }) + } + }, + Parameters = new MultimodalParameters + { + Seed = 1234, + TopK = 100, + TopP = 0.81f + } + }, + new ModelResponse + { + RequestId = "6b6738bd-dd9d-9e78-958b-02574acbda44", + Output = new MultimodalOutput( + new List + { + new( + "stop", + MultimodalMessage.Assistant( + new List + { + MultimodalMessageContent.TextContent( + "这段音频在说中文,内容是\"没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网\"。") + })) + }), + Usage = new MultimodalTokenUsage + { + InputTokens = 786, + OutputTokens = 38, + AudioTokens = 752 + } + }); + + public static readonly RequestSnapshot, + ModelResponse> + AudioSse = new( + "multimodal-generation-audio", + new ModelRequest + { + Model = "qwen-audio-turbo", + Input = new MultimodalInput + { + Messages = + new List + { + MultimodalMessage.System( + new List + { + MultimodalMessageContent.TextContent("You are a helpful assistant.") + }), + MultimodalMessage.User( + new List + { + MultimodalMessageContent.AudioContent( + "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), + MultimodalMessageContent.TextContent("这段音频的第一句话说了什么?") + }) + } + }, + Parameters = new MultimodalParameters + { + Seed = 1234, + TopK = 100, + TopP = 0.81f, + IncrementalOutput = true + } + }, + new ModelResponse + { + RequestId = "bb6ab962-af57-99f1-9af8-eb7016ebc18e", + Output = new MultimodalOutput( + new List + { + new( + "stop", + MultimodalMessage.Assistant( + new List + { + MultimodalMessageContent.TextContent("第一句话说了没有我互联网。") + })) + }), + Usage = new MultimodalTokenUsage + { + InputTokens = 783, + OutputTokens = 7, + AudioTokens = 752 + } + }); + + public static readonly RequestSnapshot, + ModelResponse> + AudioCaptionSse = new( + "multimodal-generation-audio-caption", + new ModelRequest + { + Model = "qwen3-omni-30b-a3b-captioner", + Input = new MultimodalInput + { + Messages = + new List + { + MultimodalMessage.User( + new List + { + MultimodalMessageContent.AudioContent( + "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/xvappi/%E8%A3%85%E4%BF%AE%E5%99%AA%E9%9F%B3.wav"), + }) + } + }, + Parameters = new MultimodalParameters { IncrementalOutput = true } + }, + new ModelResponse + { + RequestId = "5159c491-56f4-47a3-8197-0c81114424d8", + Output = new MultimodalOutput( + new List + { + new( + "stop", + MultimodalMessage.Assistant( + new List + { + MultimodalMessageContent.TextContent( + "The audio clip is a short, moderately clear recording—approximately 6 seconds in length—set in a small, reverberant indoor space, likely a private home or office. The dominant feature is a series of loud, metallic, rhythmic hammering noises, occurring at a regular tempo of about 120 beats per minute, with each blow exhibiting a sharp, high-frequency attack and brief metallic resonance. These impacts are highly regular, suggesting the use of a power tool such as a pneumatic nail gun or electric hammer, rather than a hand-held hammer.\n\nOverlaying this mechanical sound, a single male voice, speaking in standard Mandarin Chinese, delivers a brief, exasperated complaint. His tone is weary and resigned, marked by a sigh at the start and a drawn-out, slightly whining intonation. The spoken phrase, “哎呀,这样我还怎么安静工作啊?” (“Aiyah, how can I work quietly like this?”), directly addresses the disruptive nature of the hammering, indicating a personal, informal relationship with the person or people responsible for the noise.\n\nThe recording is of moderate quality, with both the voice and hammering clear and intelligible, though the metallic sounds are slightly distorted and clipped at their loudest peaks. There is a faint, consistent electronic hiss throughout, and a low-frequency hum—potentially from nearby electrical equipment—can be detected. The room’s acoustics are “live,” with short, bright reverberation tails on both the voice and hammering, suggesting hard surfaces and a small, enclosed space.\n\nNo other human voices, background conversations, or environmental cues are present, reinforcing the impression of a solitary, private setting. The overall atmosphere is one of mild frustration and resignation, with the speaker’s tone and the content of his complaint expressing the classic annoyance of being unable to concentrate or work in peace due to disruptive, persistent noise.\n\nIn summary, the recording captures a brief, personal moment of complaint: a Mandarin-speaking man, working alone in a quiet, reverberant indoor space, is interrupted by the rhythmic operation of a power tool, prompting him to voice his frustration at the disruption to his peace and productivity.") + })) + }), + Usage = new MultimodalTokenUsage + { + InputTokens = 160, + InputTokensDetails = new MultimodalInputTokenDetails(AudioTokens: 152, TextTokens: 8), + OutputTokens = 442, + OutputTokensDetails = new MultimodalOutputTokenDetails(TextTokens: 442), + TotalTokens = 602 + } + }); + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs index bdfc897..0418f25 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs @@ -5,7 +5,7 @@ namespace Cnblogs.DashScope.Tests.Shared.Utils; public static partial class Snapshots { - public static class MultimodalGeneration + public static partial class MultimodalGeneration { public static readonly RequestSnapshot, ModelResponse> VlNoSse = @@ -515,118 +515,6 @@ public static class MultimodalGeneration } }); - public static readonly RequestSnapshot, - ModelResponse> - AudioNoSse = new( - "multimodal-generation-audio", - new ModelRequest - { - Model = "qwen-audio-turbo", - Input = new MultimodalInput - { - Messages = - new List - { - MultimodalMessage.System( - new List - { - MultimodalMessageContent.TextContent("You are a helpful assistant.") - }), - MultimodalMessage.User( - new List - { - MultimodalMessageContent.AudioContent( - "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), - MultimodalMessageContent.TextContent("这段音频在说什么,请用简短的语言回答") - }) - } - }, - Parameters = new MultimodalParameters - { - Seed = 1234, - TopK = 100, - TopP = 0.81f - } - }, - new ModelResponse - { - RequestId = "6b6738bd-dd9d-9e78-958b-02574acbda44", - Output = new MultimodalOutput( - new List - { - new( - "stop", - MultimodalMessage.Assistant( - new List - { - MultimodalMessageContent.TextContent( - "这段音频在说中文,内容是\"没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网\"。") - })) - }), - Usage = new MultimodalTokenUsage - { - InputTokens = 786, - OutputTokens = 38, - AudioTokens = 752 - } - }); - - public static readonly RequestSnapshot, - ModelResponse> - AudioSse = new( - "multimodal-generation-audio", - new ModelRequest - { - Model = "qwen-audio-turbo", - Input = new MultimodalInput - { - Messages = - new List - { - MultimodalMessage.System( - new List - { - MultimodalMessageContent.TextContent("You are a helpful assistant.") - }), - MultimodalMessage.User( - new List - { - MultimodalMessageContent.AudioContent( - "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), - MultimodalMessageContent.TextContent("这段音频的第一句话说了什么?") - }) - } - }, - Parameters = new MultimodalParameters - { - Seed = 1234, - TopK = 100, - TopP = 0.81f, - IncrementalOutput = true - } - }, - new ModelResponse - { - RequestId = "bb6ab962-af57-99f1-9af8-eb7016ebc18e", - Output = new MultimodalOutput( - new List - { - new( - "stop", - MultimodalMessage.Assistant( - new List - { - MultimodalMessageContent.TextContent("第一句话说了没有我互联网。") - })) - }), - Usage = new MultimodalTokenUsage - { - InputTokens = 783, - OutputTokens = 7, - AudioTokens = 752 - } - }); - public static readonly RequestSnapshot, ModelResponse> VideoNoSse = new( diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.OpenAiCompatibleFile.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.OpenAiCompatibleFile.cs new file mode 100644 index 0000000..711d11f --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.OpenAiCompatibleFile.cs @@ -0,0 +1,134 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Tests.Shared.Utils; + +public static partial class Snapshots +{ + public static class OpenAiCompatibleFile + { + public static readonly FileInfo TestFile = new("RawHttpData/test2.txt"); + public static readonly FileInfo TestImage = new("RawHttpData/Lenna.jpg"); + + public static readonly RequestSnapshot UploadFileCompatibleNoSse = new( + "upload-file-compatible", + new DashScopeFile( + "file-fe-5d5eb068893f4b5e8551ada4", + "file", + 7, + 1764499365, + "test2.txt", + "file-extract", + "processed")); + + public static readonly RequestSnapshot GetFileCompatibleNoSse = new( + "get-file-compatible", + new DashScopeFile( + "file-fe-d5c0ea9110bd47afb0505f43", + "file", + 1314, + 1761480070, + "file1.txt", + "file-extract", + "processed")); + + public static readonly RequestSnapshot ListFileCompatibleNoSse = new( + "list-files-compatible", + new DashScopeOpenAiCompatibleFileList( + "list", + false, + new List + { + new( + "file-fe-d5c0ea9110bd47afb0505f43", + "file", + 1314, + 1761480070, + "file1.txt", + "file-extract", + "processed"), + })); + + public static readonly RequestSnapshot DeleteFileCompatibleNoSse = new( + "delete-file-compatible", + new DashScopeDeleteFileResult("file", true, "file-fe-d5c0ea9110bd47afb0505f43")); + } + + public static class File + { + public static readonly FileInfo TestFile = new("RawHttpData/test2.txt"); + public static readonly FileInfo TestImage = new("RawHttpData/Lenna.jpg"); + + public static readonly RequestSnapshot> ListFilesNoSse = new( + "list-files", + new DashScopeFileResponse( + "d4bdceb3-0a87-4025-b226-afb13c5a3442", + new DashScopeListFilesData( + 15, + 1, + 2, + new List + { + new( + "311d3340-1f9b-487c-bd35-481cd5a23855", + "test2.txt", + "test2", + 7, + "Td5oBnUd0kfuUGMd0zd5Ig==", + "2025-11-30 19:37:33", + "http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/311d3340-1f9b-487c-bd35-481cd5a23855/test2.txt?Expires=1764589060&OSSAccessKeyId=STS.NYUDr5WyfdYrXTGudSB7jFWoH&Signature=xa4nsjmZTcHaOfTXvv3cR7C7vNE%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5rgD8iBuqZH05uZWnL2kWQGTrhGqZLEqjz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb40tLcHrB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEJk7zIan5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK2zRlCpDUvdUGoABOb8SEKtMfDU%2FVSF1VJ7hLFCQxC%2F7xuFKTrsxyK2UMGsgt18A%2Fe8Tq%2BtiBoH94pv%2B1hhJ34C6qRwLdhbhIN31TmYd%2FV9xPc9QFJYZuh49xUXFeapxnuaM8KxoXVc94FBlIy9ccDi%2FG%2BOyNbrtISjtNhJXehcJQ66tMTRxYIVeUA4gAA%3D%3D", + "1493478651020171", + "cn-beijing", + "67516", + 193320717), + new( + "8a95f76a-8d79-4d8d-b372-7d0a72493680", + "test1.txt", + "test1", + 6, + "2wbHjR4kz3CKFM6BybYX7A==", + "2025-11-30 19:37:33", + "http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/8a95f76a-8d79-4d8d-b372-7d0a72493680/test1.txt?Expires=1764589060&OSSAccessKeyId=STS.NYUDr5WyfdYrXTGudSB7jFWoH&Signature=1Gi%2FeChAGNPeFQj2oLszyd7M3ng%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5rgD8iBuqZH05uZWnL2kWQGTrhGqZLEqjz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb40tLcHrB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEJk7zIan5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK2zRlCpDUvdUGoABOb8SEKtMfDU%2FVSF1VJ7hLFCQxC%2F7xuFKTrsxyK2UMGsgt18A%2Fe8Tq%2BtiBoH94pv%2B1hhJ34C6qRwLdhbhIN31TmYd%2FV9xPc9QFJYZuh49xUXFeapxnuaM8KxoXVc94FBlIy9ccDi%2FG%2BOyNbrtISjtNhJXehcJQ66tMTRxYIVeUA4gAA%3D%3D", + "1493478651020171", + "cn-beijing", + "67516", + 193320718) + }))); + + public static readonly RequestSnapshot> GetFileNoSse = new( + "get-file", + new DashScopeFileResponse( + "1f05e2cb-de12-46f1-872c-ab70aa15e87f", + new DashScopeFileDetail( + "file-fe-5d5eb068893f4b5e8551ada4", + "test2.txt", + string.Empty, + 7, + "Td5oBnUd0kfuUGMd0zd5Ig==", + "2025-11-30 18:42:45", + "http://dashscope-file-mgr.oss-cn-beijing.aliyuncs.com/api-fs/1493478651020171/67516/2f2e1a67-e94c-4a00-8e86-6d51d94a8f75/test2.txt?Expires=1764587166&OSSAccessKeyId=STS.NZN1pTGUrUxPQhPveYcaRAYMg&Signature=k7llO9KgcPkeuQicUgwaGR2w%2F4A%3D&security-token=CAIS1AJ1q6Ft5B2yfSjIr5n7esrgqopT4rq7U07hkmUMb%2B5%2BrpzmhTz2IHhMdHFqBOwasfQ1nWxY7P0Ylrp6SJtIXleCZtF94oxN9h2gb4fb4wUfE3vB08%2FLI3OaLjKm9u2wCryLYbGwU%2FOpbE%2B%2B5U0X6LDmdDKkckW4OJmS8%2FBOZcgWWQ%2FKBlgvRq0hRG1YpdQdKGHaONu0LxfumRCwNkdzvRdmgm4NgsbWgO%2Fks0SD0gall7ZO%2FNiqfcL%2FMvMBZskvD42Hu8VtbbfE3SJq7BxHybx7lqQs%2B02c5onNWwMMv0nZY7CNro01d1VjFqQhXqBFqPW5jvBipO3YmsHv0RFBeOZOSDQE1i1TRm1UcgnAGaHaFd6TUxylurgEBon2HKn5z1gvlRKYWhvQG45hiCYmPtXwQEGpNl5k7MlN5QbLfi8Yf1QXq3esyb6gQz4rK%2F1R8LZDUvdUGoABihW5mNOnIIV1zRuddC7OZ50nQwm%2F23uV3Y8WICHL1WbbOqhjkgUlqZdQhBVk4pNlL2QoziUCeSwPJa6o2mvoch%2BIVx5OA48YB9pBa2KYLl%2BAkVNzQVU%2FLtOR2bQQWQwIwtKwJEP107ZOFwwQgLOapGkrawOc7PEdg0Brr71x%2BrEgAA%3D%3D", + "1493478651020171", + "cn-beijing", + "67516", + 193306194))); + + public static readonly RequestSnapshot DeleteFileNoSse = + new("delete-file", new("df35151c-0df6-4cad-9912-83ebf8c633a4")); + + public static readonly RequestSnapshot> UploadFileNoSse = new( + "upload-file", + new DashScopeFileResponse( + "982c4dc2-95a0-4fa5-982e-2732f5f9c011", + new DashScopeUploadFileData( + new List() + { + new("ed5a313b-3fdf-4cc9-a0b0-66664af692e1", "test2.txt") + }, + new List() + { + new( + "test1.txt", + "BadRequest.TooMany", + "Out of number, <10> of <10> files has been uploaded.") + }))); + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs index c523850..cdafc36 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.TextGeneration.cs @@ -268,13 +268,13 @@ public static partial class MessageFormat FinishReason = "stop", Message = TextChatMessage.Assistant("2"), Logprobs = new TextGenerationLogprobs( - new List() + new List { new( "2", new byte[] { 50 }, 0.0f, - new List() + new List { new("2", new byte[] { 50 }, 0.0f) }), @@ -297,12 +297,12 @@ public static readonly ModelResponse> SingleMessageRolePlay = new( "single-generation-message-roleplay", - new ModelRequest() + new ModelRequest { Model = "qwen-plus-character", - Input = new TextGenerationInput() + Input = new TextGenerationInput { - Messages = new List() + Messages = new List { TextChatMessage.System( "你是江让,男性,从 3 岁起你就入门编程,小学就开始研习算法,初一时就已经在算法竞赛斩获全国金牌。目前你在初二年级,作为老师的助教帮忙辅导初一的竞赛生。\n你的性格特点:聪明,早慧,一路畅通的你有时很难理解其他人为什么连这么简单的问题都不会做,但除开编程范围之外,你还是一个普通的初二学生。\n你的行事风格:在编程方面乐于助人,会将自己的知识的倾囊相授,虽然问的人并不一定能跟上你的思路。\n你可以将动作、神情语气、心理活动、故事背景放在()中来表示,为对话提供补充信息。"), @@ -310,7 +310,7 @@ public static readonly TextChatMessage.User("我是蒟蒻,还在准备模拟赛。你能教我 splay 树怎么写吗?") }, }, - Parameters = new TextGenerationParameters() + Parameters = new TextGenerationParameters { ResultFormat = "message", N = 2, @@ -323,11 +323,11 @@ public static readonly } } }, - new ModelResponse() + new ModelResponse { - Output = new TextGenerationOutput() + Output = new TextGenerationOutput { - Choices = new List() + Choices = new List { new() { @@ -341,12 +341,13 @@ public static readonly { FinishReason = "stop", Index = 1, - Message = TextChatMessage.Assistant( - "行吧,不过这东西有点复杂哦~你要先了解基本的数据结构和平衡树的概念才行。。。你想不想听我说说看啊?") + Message = + TextChatMessage.Assistant( + "行吧,不过这东西有点复杂哦~你要先了解基本的数据结构和平衡树的概念才行。。。你想不想听我说说看啊?") } } }, - Usage = new TextGenerationTokenUsage() + Usage = new TextGenerationTokenUsage { InputTokens = 186, OutputTokens = 83, @@ -373,13 +374,13 @@ public static readonly { ResultFormat = "message", IncrementalOutput = false, - TranslationOptions = new TextGenerationTranslationOptions() + 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") } + Terms = new List { new("博客园", "cnblogs") }, + TmList = new List { new("代码改变世界", "Coding changes world") } } } }, @@ -425,7 +426,7 @@ public static readonly { ResultFormat = "message", EnableSearch = true, - SearchOptions = new TextGenerationSearchOptions() + SearchOptions = new TextGenerationSearchOptions { EnableSource = true, EnableCitation = true, @@ -451,7 +452,7 @@ public static readonly } }, SearchInfo = new TextGenerationWebSearchInfo( - new List() + new List { new( "无", @@ -484,7 +485,7 @@ public static readonly "阿里巴巴投資者關係-阿里巴巴集團", "https://www.alibabagroup.com/zh-HK/investor-relations") }, - new List() + new List { new( "阿里巴巴美股:\n实时价格167.05USD\n上个交易日收盘价165.09USD\n日环比%1.19%\n月环比%-6.53\n日同比%66.33\n月同比%74.05\n历史价格列表[{\"date\":\"2025-10-17\",\"endPri\":\"167.050\"},{\"date\":\"2025-10-16\",\"endPri\":\"165.090\"},{\"date\":\"2025-10-15\",\"endPri\":\"165.910\"},{\"date\":\"2025-10-14\",\"endPri\":\"162.860\"},{\"date\":\"2025-10-13\",\"endPri\":\"166.810\"},{\"date\":\"2025-10-10\",\"endPri\":\"159.010\"},{\"date\":\"2025-10-09\",\"endPri\":\"173.680\"},{\"date\":\"2025-10-08\",\"endPri\":\"181.120\"},{\"date\":\"2025-10-07\",\"endPri\":\"181.330\"},{\"date\":\"2025-10-06\",\"endPri\":\"187.220\"},{\"date\":\"2025-10-03\",\"endPri\":\"188.030\"},{\"date\":\"2025-10-02\",\"endPri\":\"189.340\"},{\"date\":\"2025-10-01\",\"endPri\":\"182.780\"},{\"date\":\"2025-09-30\",\"endPri\":\"178.730\"},{\"date\":\"2025-09-29\",\"endPri\":\"179.900\"},{\"date\":\"2025-09-26\",\"endPri\":\"171.910\"},{\"date\":\"2025-09-25\",\"endPri\":\"175.470\"},{\"date\":\"2025-09-24\",\"endPri\":\"176.440\"},{\"date\":\"2025-09-23\",\"endPri\":\"163.080\"},{\"date\":\"2025-09-22\",\"endPri\":\"164.250\"},{\"date\":\"2025-09-19\",\"endPri\":\"162.810\"},{\"date\":\"2025-09-18\",\"endPri\":\"162.480\"},{\"date\":\"2025-09-17\",\"endPri\":\"166.170\"},{\"date\":\"2025-09-16\",\"endPri\":\"162.210\"},{\"date\":\"2025-09-15\",\"endPri\":\"158.040\"},{\"date\":\"2025-09-12\",\"endPri\":\"155.060\"},{\"date\":\"2025-09-11\",\"endPri\":\"155.440\"},{\"date\":\"2025-09-10\",\"endPri\":\"143.930\"},{\"date\":\"2025-09-09\",\"endPri\":\"147.100\"},{\"date\":\"2025-09-08\",\"endPri\":\"141.200\"}]\n\n", @@ -506,19 +507,19 @@ public static readonly ModelResponse> SingleMessageWebSearchIncremental = new( "single-generation-message-search", - new ModelRequest() + new ModelRequest { Model = "qwen-plus", - Input = new TextGenerationInput() + Input = new TextGenerationInput { - Messages = new List() { TextChatMessage.User("杭州明天的天气") } + Messages = new List { TextChatMessage.User("杭州明天的天气") } }, - Parameters = new TextGenerationParameters() + Parameters = new TextGenerationParameters { ResultFormat = "message", EnableSearch = true, IncrementalOutput = true, - SearchOptions = new TextGenerationSearchOptions() + SearchOptions = new TextGenerationSearchOptions { ForcedSearch = true, EnableSource = true, @@ -527,12 +528,12 @@ public static readonly } } }, - new ModelResponse() + new ModelResponse { - Output = new TextGenerationOutput() + Output = new TextGenerationOutput { SearchInfo = new TextGenerationWebSearchInfo( - new List() + new List { new( "厦门时空科技有限公司", @@ -566,7 +567,7 @@ public static readonly "https://tianqi.eastday.com/lishi/hangzhou.html"), }, null), - Choices = new List() + Choices = new List { new() { @@ -576,7 +577,7 @@ public static readonly } } }, - Usage = new TextGenerationTokenUsage() + Usage = new TextGenerationTokenUsage { TotalTokens = 810, InputTokens = 709, @@ -869,6 +870,70 @@ public static readonly } }); + public static readonly + RequestSnapshot, + ModelResponse> + SingleMessageWithCodeInterpreterIncremental = + new( + "single-generation-message-with-code-interpreter", + new ModelRequest + { + Model = "qwen3-max-preview", + Input = new TextGenerationInput + { + Messages = + new List { TextChatMessage.User("123的21次方是多少?"), } + }, + Parameters = new TextGenerationParameters + { + ResultFormat = "message", + IncrementalOutput = true, + EnableThinking = true, + EnableCodeInterpreter = true + } + }, + new ModelResponse + { + Output = new TextGenerationOutput + { + Choices = + new List + { + new() + { + FinishReason = "stop", + Message = + TextChatMessage.Assistant( + "123的21次方是:\n\n77269364466549865653073473388030061522211723\n\n这是一个非常大的数字,共有42位数。", + null, + null, + "用户问的是123的21次方是多少。这是一个数学计算问题,我需要计算123^21的值。\n\n我可以使用代码计算器工具来计算这个大数。我需要调用code_interpreter函数,传入计算123**21的Python代码。\n\n让我准备这个函数调用。用户询问123的21次方是多少,我使用代码计算器计算出了结果。结果是一个非常大的数字:77269364466549865653073473388030061522211723\n\n我需要将这个结果清晰地呈现给") + } + }, + ToolInfo = + new List + { + new() + { + Type = "code_interpreter", + CodeInterpreter = + new ToolInfoCodeInterpreterOutput { Code = "123**21" } + } + } + }, + RequestId = "752a7de3-d3aa-4aeb-82ab-a8b08b41524b", + Usage = new TextGenerationTokenUsage + { + InputTokens = 723, + OutputTokens = 254, + TotalTokens = 977, + OutputTokensDetails = new TextGenerationOutputTokenDetails(150), + Plugins = new TextGenerationPluginUsages( + codeInterpreter: new TextGenerationCodeInterpreterPluginUsage(1)), + PromptTokensDetails = new TextGenerationPromptTokenDetails(0) + } + }); + public static readonly RequestSnapshot, ModelResponse> SingleMessageWithToolsIncremental = @@ -1123,6 +1188,53 @@ 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 e78f08b..6bcb43d 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs @@ -133,49 +133,9 @@ public static readonly }); } - public static class File - { - public static readonly FileInfo TestFile = new("RawHttpData/test1.txt"); - public static readonly FileInfo TestImage = new("RawHttpData/Lenna.jpg"); - - public static readonly RequestSnapshot UploadFileNoSse = new( - "upload-file", - new DashScopeFile("file-fe-qBKjZKfTx64R9oYmwyovNHBH", "file", 6, 1720582024, "test1.txt", "file-extract")); - - public static readonly RequestSnapshot GetFileNoSse = new( - "get-file", - new DashScopeFile("file-fe-qBKjZKfTx64R9oYmwyovNHBH", "file", 6, 1720582024, "test1.txt", "file-extract")); - - public static readonly RequestSnapshot ListFileNoSse = new( - "list-files", - new DashScopeFileList( - "list", - false, - new List - { - new( - "file-fe-qBKjZKfTx64R9oYmwyovNHBH", - "file", - 6, - 1720582024, - "test1.txt", - "file-extract"), - new( - "file-fe-WTTG89tIUTd4ByqP3K48R3bn", - "file", - 6, - 1720535665, - "test1.txt", - "file-extract") - })); - - public static readonly RequestSnapshot DeleteFileNoSse = new( - "delete-file", - new DashScopeDeleteFileResult("file", true, "file-fe-qBKjZKfTx64R9oYmwyovNHBH")); - } - public static class Upload { + // get-upload-policy.response.body.txt must be CRLF public static readonly RequestSnapshot GetPolicyNoSse = new( "get-upload-policy", new DashScopeTemporaryUploadPolicy( @@ -188,10 +148,11 @@ public static class Upload 300, 1024, 999999999, - "LTAI5tG7vL6zZFFbuNrkCjdo", + "accessKeyId", "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" diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Sut.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Sut.cs index a24149e..c390bcf 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Sut.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Sut.cs @@ -7,13 +7,13 @@ namespace Cnblogs.DashScope.Tests.Shared.Utils; public static class Sut { - public static async Task<(IDashScopeClient Client, MockHttpMessageHandler Handler)> GetTestClientAsync( + public static Task<(IDashScopeClient Client, MockHttpMessageHandler Handler)> GetTestClientAsync( HttpResponseMessage response) { var pair = GetTestClient(); pair.Handler.Configure().MockSend(Arg.Any(), Arg.Any()) .Returns(response); - return pair; + return Task.FromResult<(IDashScopeClient Client, MockHttpMessageHandler Handler)>(pair); } public static async Task<(IDashScopeClient Client, MockHttpMessageHandler Handler)> GetTestClientAsync(