diff --git a/Create-TestFiles.ps1 b/Create-TestFiles.ps1 new file mode 100644 index 0000000..048506f --- /dev/null +++ b/Create-TestFiles.ps1 @@ -0,0 +1,86 @@ +<# +.SYNOPSIS + 通过命令行参数,为测试目的创建一组标准的 HTTP 请求和响应文件。 + +.DESCRIPTION + 此脚本从命令行接受一个字符串 S 和一个类型 P (nosse 或 sse)。 + 然后,它会在指定的目录 'src/Cnblogs.DashScope.Tests.Shared/RawHttpData' 下 + 创建四个空文件: + - S-P.request.header.txt + - S-P.request.body.json + - S-P.response.header.txt + - S-P.response.body.txt + + 如果目标目录不存在,脚本会自动创建它。 + +.PARAMETER S + 用于文件名前缀的字符串,例如: GetChatCompletion。 + +.PARAMETER P + 指定请求类型,只能是 'nosse' 或 'sse'。 + +.EXAMPLE + # 使用命名参数创建文件 + .\Create-TestFiles.ps1 -S "GetChatCompletion" -P "nosse" + +.EXAMPLE + # 使用位置参数创建文件(第一个值对应-S,第二个值对应-P) + .\Create-TestFiles.ps1 "StreamChat" "sse" + +.EXAMPLE + # 如果参数无效,PowerShell 会自动报错 + .\Create-TestFiles.ps1 -S "Test" -P "invalid" + # 错误: Cannot validate argument on parameter 'P'. The argument "invalid" does not belong to the set "nosse","sse"... +#> + +# --- 1. 定义命令行参数 --- + +param ( + [Parameter(Mandatory=$true, HelpMessage="请输入字符串 S,例如: GetChatCompletion")] + [string]$S, + + [Parameter(Mandatory=$true, HelpMessage="请输入类型 P,只能是 'nosse' 或 'sse'")] + [ValidateSet("nosse", "sse")] + [string]$P +) + +# --- 2. 定义路径和文件名 --- + +# 定义基础路径 +$basePath = "test/Cnblogs.DashScope.Tests.Shared/RawHttpData" + +# 构建文件名的基础部分 +$baseFileName = "$S-$P" + +# 定义所有需要创建的文件名 +$filesToCreate = @( + "$baseFileName.request.header.txt", + "$baseFileName.request.body.json", + "$baseFileName.response.header.txt", + "$baseFileName.response.body.txt" +) + +# --- 3. 检查并创建目录 --- + +# 检查目录是否存在,如果不存在则创建 +if (-not (Test-Path -Path $basePath -PathType Container)) { + Write-Host "目录 '$basePath' 不存在,正在创建..." -ForegroundColor Yellow + New-Item -Path $basePath -ItemType Directory -Force | Out-Null +} + +# --- 4. 创建文件 --- + +Write-Host "开始为 '$baseFileName' 创建文件..." + +# 遍历文件名数组,创建每个文件 +foreach ($fileName in $filesToCreate) { + # 组合完整的文件路径 + $fullPath = Join-Path -Path $basePath -ChildPath $fileName + + # 创建空文件。-Force 参数会覆盖已存在的同名文件。 + New-Item -Path $fullPath -ItemType File -Force | Out-Null + + Write-Host "已创建: '$fullPath'" -ForegroundColor Cyan +} + +Write-Host "所有文件创建完成!" -ForegroundColor Green diff --git a/README.md b/README.md index 66e749d..ed04c87 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,17 @@ public class YourService(IDashScopeClient client) - [Prefix Completion](#prefix-completion) - [Long Context (Qwen-Long)](#long-context-qwen-long) - [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) + - [OCR](#ocr) + - [Advanced Recognition](#advanced-recognition) + - [Key Information Extraction](#key-information-extraction) + - [Table Parsing](#table-parsing) + - [Document Parsing](#document-parsing) + - [Formula Recognition](#formula-recognition) + - [Text Recognition](#text-recognition) + - [Multilanguage](#multilanguage) + - [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) @@ -275,23 +286,23 @@ while (true) Console.Write("Reasoning > "); reasoning = true; } - + Console.Write(choice.Message.ReasoningContent); continue; } - + if (reasoning) { 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) @@ -593,6 +604,728 @@ await foreach (var modelResponse in response) } ``` +### OCR + +Base example of OCR + +```csharp +// upload file +await using var tilted = File.OpenRead("tilted.png"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", tilted, "tilted.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = new List(); +messages.Add( + MultimodalMessage.User( + [ + // set enableRotate to true if your source image is tilted. + MultimodalMessageContent.ImageContent(ossLink, enableRotate: true), + ])); +var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + IncrementalOutput = true, + } + }); +var reply = new StringBuilder(); +var first = false; +MultimodalTokenUsage? usage = null; +await foreach (var chunk in completion) +{ + var choice = chunk.Output.Choices[0]; + if (first) + { + first = false; + 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})/image({usage.ImageTokens})/total({usage.TotalTokens})"); +} +``` + +#### Built-in Tasks + +##### Advanced Recognition + +When using this task, do not enable streaming. Otherwise, `completion.Output.Choices[0].Message.Content[0].OcrResult.WordsInfo` will be `null`. + +In addition to the standard text content, this task also returns the coordinates of the text. + +To call this built-in task, set `Parameters.OcrOptions.Task` to `advanced_recognition`. No additional prompt is required. + +![](sample/Cnblogs.DashScope.Sample/tilted.png) + +```csharp +var messages = new List(); +messages.Add( + MultimodalMessage.User( + [ + MultimodalMessageContent.ImageContent(ossLink), + ])); +var completion = client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "advanced_recognition" + } + } + }); +``` + +Output usage: + +```csharp +Console.WriteLine("Text:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +Console.WriteLine("WordsInfo:"); +foreach (var info in completion.Output.Choices[0].Message.Content[0].OcrResult!.WordsInfo!) +{ + var location = $"[{string.Join(',', info.Location)}]"; + var rect = $"[{string.Join(',', info.RotateRect)}]"; + Console.WriteLine(info.Text); + Console.WriteLine($"Location: {location}"); + Console.WriteLine($"RotateRect: {rect}"); + Console.WriteLine(); +} +``` + +Output: + +````csharp +Text: +```json +[ + {"rotate_rect": [236, 254, 115, 299, 90], "text": "OpenAI 兼容"}, + {"rotate_rect": [646, 254, 115, 269, 90], "text": "DashScope"}, + {"rotate_rect": [236, 684, 115, 163, 90], "text": "Python"}, + {"rotate_rect": [492, 684, 115, 105, 90], "text": "Java"}, + {"rotate_rect": [712, 684, 115, 85, 90], "text": "curl"} +] +``` +WordsInfo: +OpenAI 兼容 +Location: [46,55,205,55,205,87,46,87] +RotateRect: [125,71,159,32,0] + +DashScope +Location: [272,55,415,55,415,87,272,87] +RotateRect: [344,71,32,143,90] + +Python +Location: [82,175,169,175,169,207,82,207] +RotateRect: [126,191,32,87,90] + +Java +Location: [234,175,289,175,289,207,234,207] +RotateRect: [262,191,55,32,0] + +curl +Location: [356,175,401,175,401,207,356,207] +RotateRect: [378,191,32,45,90] +```` + +##### Key Information Extraction + +When using built-in tasks, it is not recommended to enable streaming; otherwise, `completion.Output.Choices[0].Message.Content[0].OcrResult.KvResult` will be `null`. + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `key_information_extraction`. No additional text information needs to be provided. + +You can customize the output JSON format via `Parameters.OcrOptions.TaskConfig.ResultSchema` (with a maximum of 3 levels of nesting). If left blank, all fields will be output by default. + +For example, suppose we want to extract objects of the following type from an image (JSON property names should, as much as possible, be based on the text present in the image): + +![](sample/Cnblogs.DashScope.Sample/receipt.jpg) + +```csharp +internal class ReceiptModel() +{ + [JsonPropertyName("乘车日期")] + public string? Date { get; init; } + + [JsonPropertyName("发票")] + public ReceiptSerials? Serials { get; init; } +} + +internal class ReceiptSerials +{ + [JsonPropertyName("发票代码")] + public string? Code { get; init; } + + [JsonPropertyName("发票号码")] + public string? Serial { get; init; } +} +``` + +Property could be `null` if model failed to extract value for it. +Example request: + +```csharp +await using var file = File.OpenRead("receipt.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "receipt.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "key_information_extraction", + TaskConfig = new MultimodalOcrTaskConfig() + { + ResultSchema = new Dictionary() + { + { + "发票", + new Dictionary() + { + { "发票代码", "提取图中的发票代码,通常为一组数字或字母组合" }, + { "发票号码", "提取发票上的号码,通常由纯数字组成。" } + } + }, + { "乘车日期", "对应图中乘车日期时间,格式为年-月-日,比如2025-03-05" } + } + } + } + } + }); +``` + +Consume: + +`KvResult` is `JsonElement`,you can deserialize it to any type you desire, or you could just use `Dictionary` . + +````csharp +Console.WriteLine("Text:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +Console.WriteLine("KvResults:"); +var model = completion.Output.Choices[0].Message.Content[0].OcrResult!.KvResult?.Deserialize(); +Console.WriteLine($"Date: {model?.Date}"); +Console.WriteLine($"Code: {model?.Serials?.Code}"); +Console.WriteLine($"Serial: {model?.Serials?.Serial}"); + +/* +Text: +```json +{ + "乘车日期": "2013-06-29", + "发票": { + "发票代码": "221021325353", + "发票号码": "10283819" + } +} +``` +KvResults: +Date: 2013-06-29 +Code: 221021325353 +Serial: 10283819 +Usage: in(524)/out(65)/image(310)/total(589) +*/ +```` + +##### Table Parsing + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `table_parsing`. No additional text information needs to be provided. + +This task will extract tables from images and return them in HTML format. + +Example: + +![](sample/Cnblogs.DashScope.Sample/table.jpg) + +```csharp +await using var file = File.OpenRead("table.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "table.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "table_parsing", + } + } + }); + +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +``` + +Return value(Model would wrap the html code in a markdown code fence): + +````markdown +```html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record of test data
Project name:2BControl No.CEPRI-D-JS1-JS-057-2022-003
Case nameTest No.3 Conductor rupture GL+GR(max angle)Last load grade:0%Current load grade:
MeasureLoad pointLoad methodActual Load(%)Actual Load(kN)
channelV1活载荷147.950.815
V03V2活载荷111.750.615
V04V3活载荷9.741.007
V05V4活载荷7.880.814
V06V5活载荷8.110.780
V07V6活载荷8.540.815
V08V7活载荷6.770.700
V09V8活载荷8.590.888
L01L1活载荷13.333.089
L02L2活载荷9.692.247
L03L32.961.480
L04L43.401.700
L05L52.451.224
L06L62.011.006
L07L72.381.192
L08L82.101.050
T01T1活载荷25.293.073
T02T2活载荷27.393.327
T03T3活载荷8.032.543
T04T4活载荷11.193.542
T05T5活载荷11.343.592
T06T6活载荷16.475.217
T07T7活载荷11.053.498
T08T8活载荷8.662.743
T09WT1活载荷36.562.365
T10WT2活载荷24.552.853
T11WT3活载荷38.064.784
T12WT4活载荷37.705.030
T13WT5活载荷30.484.524
+``` +```` + +##### Document Parsing + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `document_parsing`. No additional text information needs to be provided. + +This task read images(usually scanned PDF) and return them in LaTeX format. + +Example: + +![](sample/Cnblogs.DashScope.Sample/scanned.jpg) + +```csharp +await using var file = File.OpenRead("scanned.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "scanned.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "document_parsing", + } + } + }); +``` + +Returns: + +````markdown +```latex +\section*{Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution} + +Peng Wang* \quad Shuai Bai* \quad Sinan Tan* \quad Shijie Wang* \quad Zhihao Fan* \quad Jinze Bai*? \\ +Keqin Chen \quad Xuejing Liu \quad Jialin Wang \quad Wenbin Ge \quad Yang Fan \quad Kai Dang \quad Mengfei Du \\ +Xuancheng Ren \quad Rui Men \quad Dayiheng Liu \quad Chang Zhou \quad Jingren Zhou \quad Junyang Lin*? \\ +Qwen Team \quad Alibaba Group + +\begin{abstract} +We present the Qwen2-VL Series, an advanced upgrade of the previous Qwen-VL models that redefines the conventional predetermined-resolution approach in visual processing. Qwen2-VL introduces the Naive Dynamic Resolution mechanism, which enables the model to dynamically process images of varying resolutions into different numbers of visual tokens. This approach allows the model to generate more efficient and accurate visual representations, closely aligning with human perceptual processes. The model also integrates Multimodal Rotary Position Embedding (M-RoPE), facilitating the effective fusion of positional information across text, images, and videos. We employ a unified paradigm for processing both images and videos, enhancing the model's visual perception capabilities. To explore the potential of large multimodal models, Qwen2-VL investigates the scaling laws for large vision-language models (LVLMS). By scaling both the model size-with versions at 2B, 8B, and 72B parameters-and the amount of training data, the Qwen2-VL Series achieves highly competitive performance. Notably, the Qwen2-VL-72B model achieves results comparable to leading models such as GPT-4o and Claude3.5-Sonnet across various multimodal benchmarks, outperforming other generalist models. Code is available at \url{https://github.com/QwenLM/Qwen2-VL}. +\end{abstract} + +\section{Introduction} + +In the realm of artificial intelligence, Large Vision-Language Models (LVLMS) represent a significant leap forward, building upon the strong textual processing capabilities of traditional large language models. These advanced models now encompass the ability to interpret and analyze a broader spectrum of data, including images, audio, and video. This expansion of capabilities has transformed LVLMS into indispensable tools for tackling a variety of real-world challenges. Recognized for their unique capacity to condense extensive and intricate knowledge into functional representations, LVLMS are paving the way for more comprehensive cognitive systems. By integrating diverse data forms, LVLMS aim to more closely mimic the nuanced ways in which humans perceive and interact with their environment. This allows these models to provide a more accurate representation of how we engage with and perceive our environment. + +Recent advancements in large vision-language models (LVLMS) (Li et al., 2023c; Liu et al., 2023b; Dai et al., 2023; Zhu et al., 2023; Huang et al., 2023a; Bai et al., 2023b; Liu et al., 2023a; Wang et al., 2023b; OpenAI, 2023; Team et al., 2023) have led to significant improvements in a short span. These models (OpenAI, 2023; Touvron et al., 2023a,b; Chiang et al., 2023; Bai et al., 2023a) generally follow a common approach of \textit{visual encoder} $\rightarrow$ \textit{cross-modal connector} $\rightarrow$ \textit{LLM}. This setup, combined with next-token prediction as the primary training method and the availability of high-quality datasets (Liu et al., 2023a; Zhang et al., 2023; Chen et al., 2023b); + +*Equal core contribution, ?Corresponding author + +``` +```` + +##### Formula Recognition + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `formula_recognition`. No additional text information needs to be provided. + +This task read images(like handwriting formulas) and return them in LaTeX format. + +Example: + +![](sample/Cnblogs.DashScope.Sample/math.jpg) + +```csharp +// upload file +await using var file = File.OpenRead("math.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "math.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "formula_recognition", + } + } + }); + +Console.WriteLine("LaTeX:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + +if (completion.Usage != null) +{ + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); +} +``` + +Returns: + +````markdown +```latex +\begin{align*} +\tilde{G}(x) &= \frac{\alpha}{\kappa}x, \quad \tilde{T}_i = T, \quad \tilde{H}_i = \tilde{\kappa}T, \quad \tilde{\lambda}_i = \frac{1}{\kappa}\sum_{j=1}^{m}\omega_j - z_i, \\ +L(\{p_n\}; m^n) + L(\{x^n\}, m^n) + L(\{m^n\}; q_n) &= L(m^n; q_n) \\ +I^{m_n} - (L+1) &= z + \int_0^1 I^{m_n} - (L)z \leq x_m | L^{m_n} - (L) |^3 \\ +&\leq \kappa\partial_1\psi(x) + \frac{\kappa^3}{6}\partial_2^3\psi(x) - V(x) \psi(x) = \int d^3y K(x,y) \psi(y), \\ +\int_{B_{\kappa}(0)} I^{m}(w)^2 d\gamma &= \lim_{n\to\infty} \int_{B_{\kappa}(0)} r\psi(w_n)^2 d\gamma = \lim_{n\to\infty} \int_{B_{\kappa}(y_n)} d\gamma \geq \beta > 0, +\end{align*} +``` +```` + +$$ +\begin{align*} +\tilde{G}(x) &= \frac{\alpha}{\kappa}x, \quad \tilde{T}_i = T, \quad \tilde{H}_i = \tilde{\kappa}T, \quad \tilde{\lambda}_i = \frac{1}{\kappa}\sum_{j=1}^{m}\omega_j - z_i, \\ +L(\{p_n\}; m^n) + L(\{x^n\}, m^n) + L(\{m^n\}; q_n) &= L(m^n; q_n) \\ +I^{m_n} - (L+1) &= z + \int_0^1 I^{m_n} - (L)z \leq x_m | L^{m_n} - (L) |^3 \\ +&\leq \kappa\partial_1\psi(x) + \frac{\kappa^3}{6}\partial_2^3\psi(x) - V(x) \psi(x) = \int d^3y K(x,y) \psi(y), \\ +\int_{B_{\kappa}(0)} I^{m}(w)^2 d\gamma &= \lim_{n\to\infty} \int_{B_{\kappa}(0)} r\psi(w_n)^2 d\gamma = \lim_{n\to\infty} \int_{B_{\kappa}(y_n)} d\gamma \geq \beta > 0, +\end{align*} +$$ + + + +##### Text Recognition + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `text_recognition`. No additional text information needs to be provided. + +This task read the images and returns content in plain text(Chinese and English only). + +Example: + +![](sample/Cnblogs.DashScope.Sample/webpage.jpg) + +```csharp +// upload file +await using var file = File.OpenRead("webpage.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "webpage.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "text_recognition", + } + } + }); +``` + +Returns + +```plaintext +OpenAI 兼容 DashScope +Python Java curl +``` + +##### Multilanguage + +To invoke this built-in task, set `Parameters.OcrOptions.Task` to `multi_lan`. No additional text information needs to be provided. + +This task read the images and returns content in plain text(Support more languages). + +![](sample/Cnblogs.DashScope.Sample/multilanguage.jpg) + +```csharp +await using var file = File.OpenRead("multilanguage.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "multilanguage.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "multi_lan", + } + } + }); +``` + +Returns + +```csharp +INTERNATIONAL +MOTHER LANGUAGE +DAY +你好! +Прив?т! +Bonjour! +Merhaba! +Ciao! +Hello! +Ola! +???? +Salam! +``` + ## Text-to-Speech Create a speech synthesis session using `dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync()`. diff --git a/README.zh-Hans.md b/README.zh-Hans.md index 638ad1f..1e36814 100644 --- a/README.zh-Hans.md +++ b/README.zh-Hans.md @@ -99,6 +99,16 @@ public class YourService(IDashScopeClient client) - [长上下文(Qwen-Long)](#长上下文(Qwen-Long)) - [多模态](#多模态) - QWen-VL,QVQ 等,支持推理/视觉理解/OCR/音频理解等场景 + - [视觉理解/推理](#视觉理解/推理) - 图像/视频输入与理解,支持推理模式 + - [文字提取](#文字提取) - OCR 任务,读取表格/文档/公式等 + - [高精识别](#高精识别) + - [信息抽取](#信息抽取) + - [表格解析](#表格解析) + - [文档解析](#文档解析) + - [公式识别](#公式识别) + - [通用文本识别](#通用文本识别) + - [多语言识别](#多语言识别) + - [语音合成](#语音合成) - CosyVoice,Sambert 等,支持 TTS 等应用场景 - [图像生成](#图像生成) - wanx2.1 等,支持文生图,人像风格重绘等应用场景 - [应用调用](#应用调用) @@ -1186,7 +1196,7 @@ messages.Add(TextChatMessage.File(file2.Id)); messages.Add(TextChatMessage.User("这两篇文章分别讲了什么?")); ``` -最后向模型发送请求,注意这个接口获得的文件 ID 只有 `qwen-long` 和 `qwen-doc-turbo` 模型可以访问,其他模型是访问不到的。 +向模型发送请求,注意这个接口获得的文件 ID 只有 `qwen-long` 和 `qwen-doc-turbo` 模型可以访问,其他模型是访问不到的。 ```csharp var completion = client.GetTextCompletionStreamAsync( @@ -2328,6 +2338,7 @@ Usage: in(721)/out(7505)/total(0) 您也可以通过 `UploadTemporaryFileAsync` 方法上传临时文件获取 `oss://` 开头的链接。 ```csharp +// 上传本地文件 await using var lenna = File.OpenRead("Lenna.jpg"); string ossLink = await client.UploadTemporaryFileAsync("qwen3-vl-plus", lenna, "lenna.jpg"); Console.WriteLine($"File uploaded: {ossLink}"); @@ -2445,6 +2456,762 @@ messages.Add( ])); ``` +### 文字提取 + +使用 `qwen-vl-ocr` 系列模型可以很好的完成文字提取任务,基础用法: + +```csharp +// upload file +await using var tilted = File.OpenRead("tilted.png"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", tilted, "tilted.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = new List(); +messages.Add( + MultimodalMessage.User( + [ + // 如果你的图片存在偏斜,可尝试将 enableRotate 设置为 true + // 除了本地上传外,您也可以直接传入公网 URL + MultimodalMessageContent.ImageContent(ossLink, enableRotate: true), + ])); +var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters + { + IncrementalOutput = true, + } + }); +``` + +完整示例: + +```csharp +// upload file +await using var tilted = File.OpenRead("tilted.png"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", tilted, "tilted.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = new List(); +messages.Add( + MultimodalMessage.User( + [ + MultimodalMessageContent.ImageContent(ossLink, enableRotate: true), + ])); +var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + IncrementalOutput = true, + } + }); +var reply = new StringBuilder(); +var first = false; +MultimodalTokenUsage? usage = null; +await foreach (var chunk in completion) +{ + var choice = chunk.Output.Choices[0]; + if (first) + { + first = false; + 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})/image({usage.ImageTokens})/total({usage.TotalTokens})"); +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-28/435ea45f-9942-4fd4-983a-9ea8a3cd5ecb/tilted.jpg +产品介绍 +本品采用韩国进口纤维丝制造,不缩水、不变形、不发霉、 +不生菌、不伤物品表面。具有真正的不粘油、吸水力强、耐水 +浸、清洗干净、无毒、无残留、易晾干等特点。 +店家使用经验:不锈钢、陶瓷制品、浴盆、整体浴室大部分是 +白色的光洁表面,用其他的抹布擦洗表面污渍不易洗掉,太尖 +的容易划出划痕。使用这个仿真丝瓜布,沾少量中性洗涤剂揉 +出泡沫,很容易把这些表面污渍擦洗干净。 +6941990612023 +货号:2023 +Usage: in(2434)/out(155)/image(2410)/total(2589) +*/ +``` + +#### 调用内置任务 + +调用内置任务时,不建议开启流式增量传输。(将不会提供 `OcrResult` 里的额外内容,只能从文字内容中手动读取) + +##### 高精识别 + +使用内置任务时,不建议开启流式传输,否则 `completion.Output.Choices[0].Message.Content[0].OcrResult.WordsInfo` 将为 `null`。 + +除了常规的返回文字内容外,该任务还会返回文字的坐标。 + +设置 `Parameters.OcrOptions.Task` 为 `advanced_recognition` 即可调用该内置任务,不需要传入额外的 Prompt。 + +```csharp +var messages = new List(); +messages.Add( + MultimodalMessage.User( + [ + MultimodalMessageContent.ImageContent(ossLink), + ])); +var completion = client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "advanced_recognition" + } + } + }); +``` + +任务返回的文字是一个 JSON 代码块,包含文本坐标和文本内容。您可以使用 `completion.Output.Choices[0].Message.Content[0].OcrResult.WordsInfo` 直接访问结果,不需要手动反序列化模型返回的代码块。 + +示例: + +![倾斜的图像](sample/Cnblogs.DashScope.Sample/tilted.png) + +```csharp +Console.WriteLine("Text:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +Console.WriteLine("WordsInfo:"); +foreach (var info in completion.Output.Choices[0].Message.Content[0].OcrResult!.WordsInfo!) +{ + var location = $"[{string.Join(',', info.Location)}]"; + var rect = $"[{string.Join(',', info.RotateRect)}]"; + Console.WriteLine(info.Text); + Console.WriteLine($"Location: {location}"); + Console.WriteLine($"RotateRect: {rect}"); + Console.WriteLine(); +} +``` + +输出结果: + +````csharp +Text: +```json +[ + {"rotate_rect": [236, 254, 115, 299, 90], "text": "OpenAI 兼容"}, + {"rotate_rect": [646, 254, 115, 269, 90], "text": "DashScope"}, + {"rotate_rect": [236, 684, 115, 163, 90], "text": "Python"}, + {"rotate_rect": [492, 684, 115, 105, 90], "text": "Java"}, + {"rotate_rect": [712, 684, 115, 85, 90], "text": "curl"} +] +``` +WordsInfo: +OpenAI 兼容 +Location: [46,55,205,55,205,87,46,87] +RotateRect: [125,71,159,32,0] + +DashScope +Location: [272,55,415,55,415,87,272,87] +RotateRect: [344,71,32,143,90] + +Python +Location: [82,175,169,175,169,207,82,207] +RotateRect: [126,191,32,87,90] + +Java +Location: [234,175,289,175,289,207,234,207] +RotateRect: [262,191,55,32,0] + +curl +Location: [356,175,401,175,401,207,356,207] +RotateRect: [378,191,32,45,90] +```` + +##### 信息抽取 + +使用内置任务时,不建议开启流式传输,否则 `completion.Output.Choices[0].Message.Content[0].OcrResult.KvResult` 将为 `null`。 + +设置 `Parameters.OcrOptions.Task` 为 `key_information_extraction` 即可调用该内置任务,不需要传入额外的文字信息。 + +通过 `Parameters.OcrOptions.TaskConfig.ResultSchema` 可以自定义输出的 JSON 格式(至多 3 层嵌套),留空则默认输出全部字段。 + +例如我们希望从图片中抽取如下类型的对象(JSON 属性名尽可能采用图片上存在的文字): + +```csharp +internal class ReceiptModel() +{ + [JsonPropertyName("乘车日期")] + public string? Date { get; init; } + + [JsonPropertyName("发票")] + public ReceiptSerials? Serials { get; init; } +} + +internal class ReceiptSerials +{ + [JsonPropertyName("发票代码")] + public string? Code { get; init; } + + [JsonPropertyName("发票号码")] + public string? Serial { get; init; } +} +``` + +当模型识别失败时,对应字段将被设置为 `null`,需要确保代码里能够正确处理这种情况。 + +示例请求: + +![车票](sample/Cnblogs.DashScope.Sample/receipt.jpg) + +```csharp +await using var file = File.OpenRead("receipt.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "receipt.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "key_information_extraction", + TaskConfig = new MultimodalOcrTaskConfig() + { + ResultSchema = new Dictionary() + { + { + "发票", + new Dictionary() + { + { "发票代码", "提取图中的发票代码,通常为一组数字或字母组合" }, + { "发票号码", "提取发票上的号码,通常由纯数字组成。" } + } + }, + { "乘车日期", "对应图中乘车日期时间,格式为年-月-日,比如2025-03-05" } + } + } + } + } + }); +``` + +返回的 `KvResult` 是一个 `JsonElement`,可以直接反序列化到指定的类型,或者直接转换为 `Dictionary?`。 + +使用示例: + +````csharp +Console.WriteLine("Text:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +Console.WriteLine("KvResults:"); +var model = completion.Output.Choices[0].Message.Content[0].OcrResult!.KvResult?.Deserialize(); +Console.WriteLine($"Date: {model?.Date}"); +Console.WriteLine($"Code: {model?.Serials?.Code}"); +Console.WriteLine($"Serial: {model?.Serials?.Serial}"); + +/* +Text: +```json +{ + "乘车日期": "2013-06-29", + "发票": { + "发票代码": "221021325353", + "发票号码": "10283819" + } +} +``` +KvResults: +Date: 2013-06-29 +Code: 221021325353 +Serial: 10283819 +Usage: in(524)/out(65)/image(310)/total(589) +*/ +```` + +##### 表格解析 + +设置 `Parameters.OcrOptions.Task` 为 `table_parsing` 即可调用该内置任务,不需要传入额外的文字信息。 + +该任务会识读图片中的表格并返回 HTML 格式的表格。 + +示例: + +![表格](sample/Cnblogs.DashScope.Sample/table.jpg) + +```csharp +await using var file = File.OpenRead("table.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "table.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "table_parsing", + } + } + }); + +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); +``` + +返回的内容(注意最外层会包含一个 markdown 代码块标记): + +````markdown +```html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record of test data
Project name:2BControl No.CEPRI-D-JS1-JS-057-2022-003
Case nameTest No.3 Conductor rupture GL+GR(max angle)Last load grade:0%Current load grade:
MeasureLoad pointLoad methodActual Load(%)Actual Load(kN)
channelV1活载荷147.950.815
V03V2活载荷111.750.615
V04V3活载荷9.741.007
V05V4活载荷7.880.814
V06V5活载荷8.110.780
V07V6活载荷8.540.815
V08V7活载荷6.770.700
V09V8活载荷8.590.888
L01L1活载荷13.333.089
L02L2活载荷9.692.247
L03L32.961.480
L04L43.401.700
L05L52.451.224
L06L62.011.006
L07L72.381.192
L08L82.101.050
T01T1活载荷25.293.073
T02T2活载荷27.393.327
T03T3活载荷8.032.543
T04T4活载荷11.193.542
T05T5活载荷11.343.592
T06T6活载荷16.475.217
T07T7活载荷11.053.498
T08T8活载荷8.662.743
T09WT1活载荷36.562.365
T10WT2活载荷24.552.853
T11WT3活载荷38.064.784
T12WT4活载荷37.705.030
T13WT5活载荷30.484.524
+``` +```` + +##### 文档解析 + +设置 `Parameters.OcrOptions.Task` 为 `document_parsing` 即可调用该内置任务,不需要传入额外的文字信息。 + +该任务会识读图片(例如扫描版 PDF)并返回 LaTeX 格式的文档。 + +![论文](sample/Cnblogs.DashScope.Sample/scanned.jpg) + +```csharp +await using var file = File.OpenRead("scanned.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "scanned.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "document_parsing", + } + } + }); +``` + +示例返回(注意最外层会有一个 markdown 代码块): + +````markdown +```latex +\section*{Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution} + +Peng Wang* \quad Shuai Bai* \quad Sinan Tan* \quad Shijie Wang* \quad Zhihao Fan* \quad Jinze Bai*? \\ +Keqin Chen \quad Xuejing Liu \quad Jialin Wang \quad Wenbin Ge \quad Yang Fan \quad Kai Dang \quad Mengfei Du \\ +Xuancheng Ren \quad Rui Men \quad Dayiheng Liu \quad Chang Zhou \quad Jingren Zhou \quad Junyang Lin*? \\ +Qwen Team \quad Alibaba Group + +\begin{abstract} +We present the Qwen2-VL Series, an advanced upgrade of the previous Qwen-VL models that redefines the conventional predetermined-resolution approach in visual processing. Qwen2-VL introduces the Naive Dynamic Resolution mechanism, which enables the model to dynamically process images of varying resolutions into different numbers of visual tokens. This approach allows the model to generate more efficient and accurate visual representations, closely aligning with human perceptual processes. The model also integrates Multimodal Rotary Position Embedding (M-RoPE), facilitating the effective fusion of positional information across text, images, and videos. We employ a unified paradigm for processing both images and videos, enhancing the model's visual perception capabilities. To explore the potential of large multimodal models, Qwen2-VL investigates the scaling laws for large vision-language models (LVLMS). By scaling both the model size-with versions at 2B, 8B, and 72B parameters-and the amount of training data, the Qwen2-VL Series achieves highly competitive performance. Notably, the Qwen2-VL-72B model achieves results comparable to leading models such as GPT-4o and Claude3.5-Sonnet across various multimodal benchmarks, outperforming other generalist models. Code is available at \url{https://github.com/QwenLM/Qwen2-VL}. +\end{abstract} + +\section{Introduction} + +In the realm of artificial intelligence, Large Vision-Language Models (LVLMS) represent a significant leap forward, building upon the strong textual processing capabilities of traditional large language models. These advanced models now encompass the ability to interpret and analyze a broader spectrum of data, including images, audio, and video. This expansion of capabilities has transformed LVLMS into indispensable tools for tackling a variety of real-world challenges. Recognized for their unique capacity to condense extensive and intricate knowledge into functional representations, LVLMS are paving the way for more comprehensive cognitive systems. By integrating diverse data forms, LVLMS aim to more closely mimic the nuanced ways in which humans perceive and interact with their environment. This allows these models to provide a more accurate representation of how we engage with and perceive our environment. + +Recent advancements in large vision-language models (LVLMS) (Li et al., 2023c; Liu et al., 2023b; Dai et al., 2023; Zhu et al., 2023; Huang et al., 2023a; Bai et al., 2023b; Liu et al., 2023a; Wang et al., 2023b; OpenAI, 2023; Team et al., 2023) have led to significant improvements in a short span. These models (OpenAI, 2023; Touvron et al., 2023a,b; Chiang et al., 2023; Bai et al., 2023a) generally follow a common approach of \textit{visual encoder} $\rightarrow$ \textit{cross-modal connector} $\rightarrow$ \textit{LLM}. This setup, combined with next-token prediction as the primary training method and the availability of high-quality datasets (Liu et al., 2023a; Zhang et al., 2023; Chen et al., 2023b); + +*Equal core contribution, ?Corresponding author + +``` +```` + +##### 公式识别 + +设置 `Parameters.OcrOptions.Task` 为 `formula_recognition` 即可调用该内置任务,不需要传入额外的文字信息。 + +该任务会识读图片中的公式(例如手写数学公式)并以 LaTeX 形式返回。 + +![手写数学公式](sample/Cnblogs.DashScope.Sample/math.jpg) + +```csharp +// upload file +await using var file = File.OpenRead("math.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "math.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "formula_recognition", + } + } + }); + +Console.WriteLine("LaTeX:"); +Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + +if (completion.Usage != null) +{ + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); +} +``` + +返回结果 + +````markdown +```latex +\begin{align*} +\tilde{G}(x) &= \frac{\alpha}{\kappa}x, \quad \tilde{T}_i = T, \quad \tilde{H}_i = \tilde{\kappa}T, \quad \tilde{\lambda}_i = \frac{1}{\kappa}\sum_{j=1}^{m}\omega_j - z_i, \\ +L(\{p_n\}; m^n) + L(\{x^n\}, m^n) + L(\{m^n\}; q_n) &= L(m^n; q_n) \\ +I^{m_n} - (L+1) &= z + \int_0^1 I^{m_n} - (L)z \leq x_m | L^{m_n} - (L) |^3 \\ +&\leq \kappa\partial_1\psi(x) + \frac{\kappa^3}{6}\partial_2^3\psi(x) - V(x) \psi(x) = \int d^3y K(x,y) \psi(y), \\ +\int_{B_{\kappa}(0)} I^{m}(w)^2 d\gamma &= \lim_{n\to\infty} \int_{B_{\kappa}(0)} r\psi(w_n)^2 d\gamma = \lim_{n\to\infty} \int_{B_{\kappa}(y_n)} d\gamma \geq \beta > 0, +\end{align*} +``` +```` + +##### 通用文本识别 + +设置 `Parameters.OcrOptions.Task` 为 `text_recognition` 即可调用该内置任务,不需要传入额外的文字信息。 + +该任务会识读图片中文字(中英文)并以纯文本形式返回。 + +示例请求: + +![网页](sample/Cnblogs.DashScope.Sample/webpage.jpg) + +```csharp +// upload file +await using var file = File.OpenRead("webpage.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "webpage.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "text_recognition", + } + } + }); +``` + +示例返回 + +```plaintext +OpenAI 兼容 DashScope +Python Java curl +``` + +##### 多语言识别 + +设置 `Parameters.OcrOptions.Task` 为 `multi_lan` 即可调用该内置任务,不需要传入额外的文字信息。 + +该任务会识读图片中文字并以纯文本形式返回,支持小语种的识别。 + +如果确定输入图片不包含除中英文以外的语种,请不要使用这个任务,减少误识别的几率。 + +示例请求: + +![Hello](sample/Cnblogs.DashScope.Sample/multilanguage.jpg) + +```csharp +await using var file = File.OpenRead("multilanguage.jpg"); +var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "multilanguage.jpg"); +Console.WriteLine($"File uploaded: {ossLink}"); +var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; +var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "multi_lan", + } + } + }); +``` + +示例返回: + +```csharp +INTERNATIONAL +MOTHER LANGUAGE +DAY +你好! +Прив?т! +Bonjour! +Merhaba! +Ciao! +Hello! +Ola! +???? +Salam! +``` + ## 语音合成 通过 `dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync()` 来创建一个语音合成会话。 diff --git a/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj b/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj index f4ce91b..b75cd98 100644 --- a/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj +++ b/sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj @@ -29,6 +29,27 @@ PreserveNewest + + Always + + + PreserveNewest + + + PreserveNewest + + + Always + + + PreserveNewest + + + PreserveNewest + + + Always + diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs new file mode 100644 index 0000000..4189135 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrAdvancedRecognitionSample.cs @@ -0,0 +1,86 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrAdvancedRecognitionSample : ISample +{ + /// + public string Description => "OCR Advanced Recognition Task Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("webpage.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "webpage.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() { Task = "advanced_recognition" } + } + }); + + Console.WriteLine("Text:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + Console.WriteLine("WordsInfo:"); + foreach (var info in completion.Output.Choices[0].Message.Content[0].OcrResult!.WordsInfo!) + { + var location = $"[{string.Join(',', info.Location)}]"; + var rect = $"[{string.Join(',', info.RotateRect)}]"; + Console.WriteLine(info.Text); + Console.WriteLine($"Location: {location}"); + Console.WriteLine($"RotateRect: {rect}"); + Console.WriteLine(); + } + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/90f86409-6868-4e34-83e1-efce3c72477c/webpage.jpg +Text: +```json +[ + {"rotate_rect": [236, 254, 115, 299, 90], "text": "OpenAI 兼容"}, + {"rotate_rect": [646, 254, 115, 269, 90], "text": "DashScope"}, + {"rotate_rect": [236, 684, 115, 163, 90], "text": "Python"}, + {"rotate_rect": [492, 684, 115, 105, 90], "text": "Java"}, + {"rotate_rect": [712, 684, 115, 85, 90], "text": "curl"} +] +``` +WordsInfo: +OpenAI 兼容 +Location: [46,55,205,55,205,87,46,87] +RotateRect: [125,71,159,32,0] + +DashScope +Location: [272,55,415,55,415,87,272,87] +RotateRect: [344,71,32,143,90] + +Python +Location: [82,175,169,175,169,207,82,207] +RotateRect: [126,191,32,87,90] + +Java +Location: [234,175,289,175,289,207,234,207] +RotateRect: [262,191,55,32,0] + +curl +Location: [356,175,401,175,401,207,356,207] +RotateRect: [378,191,32,45,90] + +Usage: in(175)/out(186)/image(142)/total(361) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs new file mode 100644 index 0000000..fde2dc1 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrDocumentToLaTeXSample.cs @@ -0,0 +1,70 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrDocumentToLaTeXSample : ISample +{ + /// + public string Description => "OCR parsing scanned document to LaTeX sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("scanned.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "scanned.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "document_parsing", + } + } + }); + + Console.WriteLine("LaTeX:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/0c817c8b-2d8c-4642-b805-bb20f5349b73/scanned.jpg +LaTeX: +```latex +\section*{Qwen2-VL: Enhancing Vision-Language Model's Perception of the World at Any Resolution} + +Peng Wang* \quad Shuai Bai* \quad Sinan Tan* \quad Shijie Wang* \quad Zhihao Fan* \quad Jinze Bai*? \\ +Keqin Chen \quad Xuejing Liu \quad Jialin Wang \quad Wenbin Ge \quad Yang Fan \quad Kai Dang \quad Mengfei Du \\ +Xuancheng Ren \quad Rui Men \quad Dayiheng Liu \quad Chang Zhou \quad Jingren Zhou \quad Junyang Lin*? \\ +Qwen Team \quad Alibaba Group + +\begin{abstract} +We present the Qwen2-VL Series, an advanced upgrade of the previous Qwen-VL models that redefines the conventional predetermined-resolution approach in visual processing. Qwen2-VL introduces the Naive Dynamic Resolution mechanism, which enables the model to dynamically process images of varying resolutions into different numbers of visual tokens. This approach allows the model to generate more efficient and accurate visual representations, closely aligning with human perceptual processes. The model also integrates Multimodal Rotary Position Embedding (M-RoPE), facilitating the effective fusion of positional information across text, images, and videos. We employ a unified paradigm for processing both images and videos, enhancing the model's visual perception capabilities. To explore the potential of large multimodal models, Qwen2-VL investigates the scaling laws for large vision-language models (LVLMS). By scaling both the model size-with versions at 2B, 8B, and 72B parameters-and the amount of training data, the Qwen2-VL Series achieves highly competitive performance. Notably, the Qwen2-VL-72B model achieves results comparable to leading models such as GPT-4o and Claude3.5-Sonnet across various multimodal benchmarks, outperforming other generalist models. Code is available at \url{https://github.com/QwenLM/Qwen2-VL}. +\end{abstract} + +\section{Introduction} + +In the realm of artificial intelligence, Large Vision-Language Models (LVLMS) represent a significant leap forward, building upon the strong textual processing capabilities of traditional large language models. These advanced models now encompass the ability to interpret and analyze a broader spectrum of data, including images, audio, and video. This expansion of capabilities has transformed LVLMS into indispensable tools for tackling a variety of real-world challenges. Recognized for their unique capacity to condense extensive and intricate knowledge into functional representations, LVLMS are paving the way for more comprehensive cognitive systems. By integrating diverse data forms, LVLMS aim to more closely mimic the nuanced ways in which humans perceive and interact with their environment. This allows these models to provide a more accurate representation of how we engage with and perceive our environment. + +Recent advancements in large vision-language models (LVLMS) (Li et al., 2023c; Liu et al., 2023b; Dai et al., 2023; Zhu et al., 2023; Huang et al., 2023a; Bai et al., 2023b; Liu et al., 2023a; Wang et al., 2023b; OpenAI, 2023; Team et al., 2023) have led to significant improvements in a short span. These models (OpenAI, 2023; Touvron et al., 2023a,b; Chiang et al., 2023; Bai et al., 2023a) generally follow a common approach of \textit{visual encoder} $\rightarrow$ \textit{cross-modal connector} $\rightarrow$ \textit{LLM}. This setup, combined with next-token prediction as the primary training method and the availability of high-quality datasets (Liu et al., 2023a; Zhang et al., 2023; Chen et al., 2023b); + +*Equal core contribution, ?Corresponding author + +``` +Usage: in(2595)/out(873)/image(2540)/total(3468) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs new file mode 100644 index 0000000..d1dd377 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrFormulaRecognitionSample.cs @@ -0,0 +1,58 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrFormulaRecognitionSample : ISample +{ + /// + public string Description => "OCR Math Formula Recognition Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("math.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "math.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "formula_recognition", + } + } + }); + + Console.WriteLine("LaTeX:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/073293f5-1294-4110-ba64-c614b509d7c6/math.jpg +LaTeX: +```latex +\begin{align*} +\tilde{G}(x) &= \frac{\alpha}{\kappa}x, \quad \tilde{T}_i = T, \quad \tilde{H}_i = \tilde{\kappa}T, \quad \tilde{\lambda}_i = \frac{1}{\kappa}\sum_{j=1}^{m}\omega_j - z_i, \\ +L(\{p_n\}; m^n) + L(\{x^n\}, m^n) + L(\{m^n\}; q_n) &= L(m^n; q_n) \\ +I^{m_n} - (L+1) &= z + \int_0^1 I^{m_n} - (L)z \leq x_m | L^{m_n} - (L) |^3 \\ +&\leq \kappa\partial_1\psi(x) + \frac{\kappa^3}{6}\partial_2^3\psi(x) - V(x) \psi(x) = \int d^3y K(x,y) \psi(y), \\ +\int_{B_{\kappa}(0)} I^{m}(w)^2 d\gamma &= \lim_{n\to\infty} \int_{B_{\kappa}(0)} r\psi(w_n)^2 d\gamma = \lim_{n\to\infty} \int_{B_{\kappa}(y_n)} d\gamma \geq \beta > 0, +\end{align*} +``` +Usage: in(135)/out(339)/image(107)/total(474) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs new file mode 100644 index 0000000..f8507ad --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrKeyInformationExtractionSample.cs @@ -0,0 +1,103 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrKeyInformationExtractionSample : ISample +{ + /// + public string Description => "OCR Key Information Extraction Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("receipt.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "receipt.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "key_information_extraction", + TaskConfig = new MultimodalOcrTaskConfig() + { + ResultSchema = new Dictionary() + { + { + "发票", + new Dictionary() + { + { "发票代码", "提取图中的发票代码,通常为一组数字或字母组合" }, + { "发票号码", "提取发票上的号码,通常由纯数字组成。" } + } + }, + { "乘车日期", "对应图中乘车日期时间,格式为年-月-日,比如2025-03-05" } + } + } + } + } + }); + + Console.WriteLine("Text:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + Console.WriteLine("KvResults:"); + var model = completion.Output.Choices[0].Message.Content[0].OcrResult!.KvResult?.Deserialize(); + Console.WriteLine($"Date: {model?.Date}"); + Console.WriteLine($"Code: {model?.Serials?.Code}"); + Console.WriteLine($"Serial: {model?.Serials?.Serial}"); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +internal class ReceiptModel() +{ + [JsonPropertyName("乘车日期")] + public string? Date { get; init; } + + [JsonPropertyName("发票")] + public ReceiptSerials? Serials { get; init; } +} + +internal class ReceiptSerials +{ + [JsonPropertyName("发票代码")] + public string? Code { get; init; } + + [JsonPropertyName("发票号码")] + public string? Serial { get; init; } +} + + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/16a422bd-811b-435a-9e2d-8538784dc64d/receipt.jpg +Text: +```json +{ + "乘车日期": "2013-06-29", + "发票": { + "发票代码": "221021325353", + "发票号码": "10283819" + } +} +``` +KvResults: +Date: 2013-06-29 +Code: 221021325353 +Serial: 10283819 +Usage: in(524)/out(65)/image(310)/total(589) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs new file mode 100644 index 0000000..0733a7f --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrMultilanguageSample.cs @@ -0,0 +1,61 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrMultilanguageSample : ISample +{ + /// + public string Description => "OCR Text Recognition(Multilanguage) Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("multilanguage.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "multilanguage.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "multi_lan", + } + } + }); + + Console.WriteLine("Text:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/fa37bfc1-946b-4347-9c0a-fba6abccc43f/multilanguage.jpg +Text: +INTERNATIONAL +MOTHER LANGUAGE +DAY +你好! +Прив?т! +Bonjour! +Merhaba! +Ciao! +Hello! +Ola! +???? +Salam! +Usage: in(4444)/out(36)/image(4420)/total(4480) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs new file mode 100644 index 0000000..aa06b13 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrSample.cs @@ -0,0 +1,79 @@ +using System.Text; +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrSample : ISample +{ + /// + public string Description => "OCR Sample with rotate enabled"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var tilted = File.OpenRead("tilted.png"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", tilted, "tilted.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = new List(); + messages.Add( + MultimodalMessage.User( + [ + MultimodalMessageContent.ImageContent(ossLink, enableRotate: true), + ])); + var completion = client.GetMultimodalGenerationStreamAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() { Messages = messages }, + Parameters = new MultimodalParameters() + { + IncrementalOutput = true, + } + }); + var reply = new StringBuilder(); + var first = false; + MultimodalTokenUsage? usage = null; + await foreach (var chunk in completion) + { + var choice = chunk.Output.Choices[0]; + if (first) + { + first = false; + 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})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-28/435ea45f-9942-4fd4-983a-9ea8a3cd5ecb/tilted.jpg +产品介绍 +本品采用韩国进口纤维丝制造,不缩水、不变形、不发霉、 +不生菌、不伤物品表面。具有真正的不粘油、吸水力强、耐水 +浸、清洗干净、无毒、无残留、易晾干等特点。 +店家使用经验:不锈钢、陶瓷制品、浴盆、整体浴室大部分是 +白色的光洁表面,用其他的抹布擦洗表面污渍不易洗掉,太尖 +的容易划出划痕。使用这个仿真丝瓜布,沾少量中性洗涤剂揉 +出泡沫,很容易把这些表面污渍擦洗干净。 +6941990612023 +货号:2023 +Usage: in(2434)/out(155)/image(2410)/total(2589) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs new file mode 100644 index 0000000..1650201 --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTableParsingSample.cs @@ -0,0 +1,277 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrTableParsingSample : ISample +{ + /// + public string Description => "OCR Table Parsing Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("table.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "table.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "table_parsing", + } + } + }); + + Console.WriteLine("HTML:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/9a7188f6-25ed-437b-8268-e95da646bdcf/table.jpg +HTML: +```html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Record of test data
Project name:2BControl No.CEPRI-D-JS1-JS-057-2022-003
Case nameTest No.3 Conductor rupture GL+GR(max angle)Last load grade:0%Current load grade:
MeasureLoad pointLoad methodActual Load(%)Actual Load(kN)
channelV1活载荷147.950.815
V03V2活载荷111.750.615
V04V3活载荷9.741.007
V05V4活载荷7.880.814
V06V5活载荷8.110.780
V07V6活载荷8.540.815
V08V7活载荷6.770.700
V09V8活载荷8.590.888
L01L1活载荷13.333.089
L02L2活载荷9.692.247
L03L32.961.480
L04L43.401.700
L05L52.451.224
L06L62.011.006
L07L72.381.192
L08L82.101.050
T01T1活载荷25.293.073
T02T2活载荷27.393.327
T03T3活载荷8.032.543
T04T4活载荷11.193.542
T05T5活载荷11.343.592
T06T6活载荷16.475.217
T07T7活载荷11.053.498
T08T8活载荷8.662.743
T09WT1活载荷36.562.365
T10WT2活载荷24.552.853
T11WT3活载荷38.064.784
T12WT4活载荷37.705.030
T13WT5活载荷30.484.524
+``` +Usage: in(2731)/out(1877)/image(2657)/total(4608) + */ diff --git a/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs new file mode 100644 index 0000000..cc7a64a --- /dev/null +++ b/sample/Cnblogs.DashScope.Sample/Multimodal/OcrTextRecognition.cs @@ -0,0 +1,51 @@ +using Cnblogs.DashScope.Core; + +namespace Cnblogs.DashScope.Sample.Multimodal; + +public class OcrTextRecognition : ISample +{ + /// + public string Description => "OCR Text Recognition(Chinese and English) Sample"; + + /// + public async Task RunAsync(IDashScopeClient client) + { + // upload file + await using var file = File.OpenRead("webpage.jpg"); + var ossLink = await client.UploadTemporaryFileAsync("qwen-vl-ocr-latest", file, "webpage.jpg"); + Console.WriteLine($"File uploaded: {ossLink}"); + var messages = + new List { MultimodalMessage.User([MultimodalMessageContent.ImageContent(ossLink)]) }; + var completion = await client.GetMultimodalGenerationAsync( + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput { Messages = messages }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "text_recognition", + } + } + }); + + Console.WriteLine("Text:"); + Console.WriteLine(completion.Output.Choices[0].Message.Content[0].Text); + + if (completion.Usage != null) + { + var usage = completion.Usage; + Console.WriteLine( + $"Usage: in({usage.InputTokens})/out({usage.OutputTokens})/image({usage.ImageTokens})/total({usage.TotalTokens})"); + } + } +} + +/* +File uploaded: oss://dashscope-instant/52afe077fb4825c6d74411758cb1ab98/2025-11-29/fb524efd-e1a1-49d5-9d38-d69d09f5f5f0/webpage.jpg +Text: +OpenAI 兼容 DashScope +Python Java curl +Usage: in(154)/out(12)/image(130)/total(166) + */ diff --git a/sample/Cnblogs.DashScope.Sample/math.jpg b/sample/Cnblogs.DashScope.Sample/math.jpg new file mode 100644 index 0000000..daf2fc5 Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/math.jpg differ diff --git a/sample/Cnblogs.DashScope.Sample/multilanguage.jpg b/sample/Cnblogs.DashScope.Sample/multilanguage.jpg new file mode 100644 index 0000000..dea8fc2 Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/multilanguage.jpg differ diff --git a/sample/Cnblogs.DashScope.Sample/receipt.jpg b/sample/Cnblogs.DashScope.Sample/receipt.jpg new file mode 100644 index 0000000..6f751b9 Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/receipt.jpg differ diff --git a/sample/Cnblogs.DashScope.Sample/scanned.jpg b/sample/Cnblogs.DashScope.Sample/scanned.jpg new file mode 100644 index 0000000..6f3c64d Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/scanned.jpg differ diff --git a/sample/Cnblogs.DashScope.Sample/table.jpg b/sample/Cnblogs.DashScope.Sample/table.jpg new file mode 100644 index 0000000..b4d3abb Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/table.jpg differ diff --git a/sample/Cnblogs.DashScope.Sample/tilted.png b/sample/Cnblogs.DashScope.Sample/tilted.png new file mode 100644 index 0000000..b7b864a Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/tilted.png differ diff --git a/sample/Cnblogs.DashScope.Sample/webpage.jpg b/sample/Cnblogs.DashScope.Sample/webpage.jpg new file mode 100644 index 0000000..9e1a1aa Binary files /dev/null and b/sample/Cnblogs.DashScope.Sample/webpage.jpg differ diff --git a/src/Cnblogs.DashScope.Core/IMultimodalParameters.cs b/src/Cnblogs.DashScope.Core/IMultimodalParameters.cs index 955f651..5156eeb 100644 --- a/src/Cnblogs.DashScope.Core/IMultimodalParameters.cs +++ b/src/Cnblogs.DashScope.Core/IMultimodalParameters.cs @@ -21,4 +21,9 @@ public interface IMultimodalParameters /// Options for speech recognition. /// AsrOptions? AsrOptions { get; } + + /// + /// Extra configurations for OCR models. + /// + MultimodalOcrOptions? OcrOptions { get; } } diff --git a/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs b/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs index 6d1a5b0..5663054 100644 --- a/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs +++ b/src/Cnblogs.DashScope.Core/MultimodalMessageContent.cs @@ -19,7 +19,8 @@ public record MultimodalMessageContent( int? MinPixels = null, int? MaxPixels = null, bool? EnableRotate = null, - float? Fps = null) + float? Fps = null, + MultimodalOcrResult? OcrResult = null) { private const string OssSchema = "oss://"; diff --git a/src/Cnblogs.DashScope.Core/MultimodalOcrOptions.cs b/src/Cnblogs.DashScope.Core/MultimodalOcrOptions.cs new file mode 100644 index 0000000..0d087aa --- /dev/null +++ b/src/Cnblogs.DashScope.Core/MultimodalOcrOptions.cs @@ -0,0 +1,20 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Options for OCR model. +/// +public class MultimodalOcrOptions +{ + /// + /// Name of the task. + /// + /// + /// Some task example: "text_recognition", "key_information_extraction", "document_parsing", "table_parsing" + /// + public string? Task { get; set; } + + /// + /// Config for the task. + /// + public MultimodalOcrTaskConfig? TaskConfig { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/MultimodalOcrResult.cs b/src/Cnblogs.DashScope.Core/MultimodalOcrResult.cs new file mode 100644 index 0000000..0a76ceb --- /dev/null +++ b/src/Cnblogs.DashScope.Core/MultimodalOcrResult.cs @@ -0,0 +1,10 @@ +using System.Text.Json; + +namespace Cnblogs.DashScope.Core; + +/// +/// OCR result from the model. +/// +/// The words that model recognized. +/// Meta info that extracted from the image. +public record MultimodalOcrResult(List? WordsInfo, JsonElement? KvResult); diff --git a/src/Cnblogs.DashScope.Core/MultimodalOcrTaskConfig.cs b/src/Cnblogs.DashScope.Core/MultimodalOcrTaskConfig.cs new file mode 100644 index 0000000..8724e21 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/MultimodalOcrTaskConfig.cs @@ -0,0 +1,28 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Configuration of OCR task. +/// +public class MultimodalOcrTaskConfig +{ + /// + /// The resulting JSON schema, value should be empty string. + /// + /// + /// + /// var schema = new Dictionary<string, object>() + /// { + /// { + /// "收件人信息", + /// new Dictionary<string, object>() + /// { + /// "收件人姓名", string.Empty, + /// "收件人电话号码", string.Empty, + /// "收件人地址", string.Empty + /// } + /// } + /// } + /// + /// + public Dictionary? ResultSchema { get; set; } +} diff --git a/src/Cnblogs.DashScope.Core/MultimodalOcrWordInfo.cs b/src/Cnblogs.DashScope.Core/MultimodalOcrWordInfo.cs new file mode 100644 index 0000000..87d8108 --- /dev/null +++ b/src/Cnblogs.DashScope.Core/MultimodalOcrWordInfo.cs @@ -0,0 +1,9 @@ +namespace Cnblogs.DashScope.Core; + +/// +/// Word location and info recognized by the model. +/// +/// OCR result. +/// Four point of the word rect, (0, 0) is the left-top of the image. The points are clockwise, starting from the left-top of the rect. e.g. [x1, y1, x2, y2, x3, y3, x4, y4] +/// Another presentation of the word rect. First two are the center point of the rect, then follows the width and height. The last value is rect's rotate angle from the landscape. e.g. [center_x, center_y, width, height, angle] +public record MultimodalOcrWordInfo(string Text, int[] RotateRect, int[] Location); diff --git a/src/Cnblogs.DashScope.Core/MultimodalParameters.cs b/src/Cnblogs.DashScope.Core/MultimodalParameters.cs index 68460f0..36cb36a 100644 --- a/src/Cnblogs.DashScope.Core/MultimodalParameters.cs +++ b/src/Cnblogs.DashScope.Core/MultimodalParameters.cs @@ -43,4 +43,7 @@ public class MultimodalParameters : IMultimodalParameters /// public int? ThinkingBudget { get; set; } + + /// + public MultimodalOcrOptions? OcrOptions { get; set; } } diff --git a/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs b/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs index 604b490..aac5cdd 100644 --- a/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs +++ b/test/Cnblogs.DashScope.Sdk.UnitTests/MultimodalGenerationSerializationTests.cs @@ -74,6 +74,8 @@ ModelResponse>> NoSseData Snapshots.MultimodalGeneration.VlNoSse, Snapshots.MultimodalGeneration.AudioNoSse, Snapshots.MultimodalGeneration.OcrNoSse, + Snapshots.MultimodalGeneration.OcrAdvancedRecognitionNoSse, + Snapshots.MultimodalGeneration.OcrKeyInformationExtractionNoSse, Snapshots.MultimodalGeneration.VideoNoSse }; diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.body.json new file mode 100644 index 0000000..2e9e31a --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.body.json @@ -0,0 +1,20 @@ +{ + "model": "qwen-vl-ocr-latest", + "input":{ + "messages":[ + { + "role": "user", + "content": [ + { + "image": "https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5727078571/p1008252.png" + } + ] + } + ] + }, + "parameters": { + "ocr_options": { + "task": "advanced_recognition" + } + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.header.txt new file mode 100644 index 0000000..961e2c8 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/multimodal-generation/generation HTTP/1.1 +Content-Type: application/json +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 456 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.body.txt new file mode 100644 index 0000000..7552f9f --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.body.txt @@ -0,0 +1 @@ +{"output":{"choices":[{"finish_reason":"stop","message":{"content":[{"ocr_result":{"words_info":[{"location":[1704,390,4314,390,4314,675,1704,675],"rotate_rect":[3009,532,285,2610,90],"text":"INTERNATIONAL"},{"location":[1368,804,4626,804,4626,1089,1368,1089],"rotate_rect":[2997,946,285,3258,90],"text":"MOTHER LANGUAGE"},{"location":[2682,1242,3336,1242,3336,1527,2682,1527],"rotate_rect":[3009,1384,285,654,90],"text":"DAY"},{"location":[5058,819,5670,633,5928,846,5316,1032],"rotate_rect":[5493,832,279,825,73],"text":"你好!"},{"location":[24,936,198,780,930,981,756,1137],"rotate_rect":[477,959,886,197,15],"text":"Привіт!"},{"location":[720,2016,894,1860,1626,2061,1452,2217],"rotate_rect":[1173,2038,886,197,15],"text":"Bonjour!"},{"location":[-30,2244,114,2112,846,2313,696,2445],"rotate_rect":[408,2279,863,167,15],"text":"Merhaba!"},{"location":[1632,2322,2058,2322,2058,2487,1632,2487],"rotate_rect":[1845,2404,165,426,90],"text":"Ciao!"},{"location":[2514,2196,3312,2196,3312,2445,2514,2445],"rotate_rect":[2913,2320,249,798,90],"text":"Hello!"},{"location":[3882,2400,4176,2400,4176,2541,3882,2541],"rotate_rect":[4029,2470,141,294,90],"text":"Ola!"},{"location":[4218,2103,4884,1851,5064,1974,4398,2226],"rotate_rect":[4641,2039,179,837,69],"text":"שלום רב!"},{"location":[5136,2190,5730,2028,5874,2163,5280,2325],"rotate_rect":[5505,2176,168,719,75],"text":"Salam!"}]},"text":"```json\n[\n\t{\"rotate_rect\": [502, 178, 95, 435, 90], \"text\": \"INTERNATIONAL\"},\n\t{\"rotate_rect\": [500, 316, 95, 543, 90], \"text\": \"MOTHER LANGUAGE\"},\n\t{\"rotate_rect\": [502, 462, 95, 109, 90], \"text\": \"DAY\"},\n\t{\"rotate_rect\": [916, 278, 83, 119, 59], \"text\": \"你好!\"},\n\t{\"rotate_rect\": [80, 320, 139, 60, 29], \"text\": \"Привіт!\"},\n\t{\"rotate_rect\": [196, 680, 139, 60, 29], \"text\": \"Bonjour!\"},\n\t{\"rotate_rect\": [68, 760, 139, 51, 29], \"text\": \"Merhaba!\"},\n\t{\"rotate_rect\": [308, 802, 55, 71, 90], \"text\": \"Ciao!\"},\n\t{\"rotate_rect\": [486, 774, 83, 133, 90], \"text\": \"Hello!\"},\n\t{\"rotate_rect\": [672, 824, 47, 49, 90], \"text\": \"Ola!\"},\n\t{\"rotate_rect\": [774, 680, 51, 139, 53], \"text\": \"שלום רב!\"},\n\t{\"rotate_rect\": [918, 726, 51, 113, 62], \"text\": \"Salam!\"}\n]\n```"}],"role":"assistant"}}]},"usage":{"image_tokens":1862,"input_tokens":1895,"input_tokens_details":{"image_tokens":1862,"text_tokens":33},"output_tokens":432,"output_tokens_details":{"text_tokens":432},"total_tokens":2327},"request_id":"e72413ae-c147-4904-a63b-c09e87ea133a"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.header.txt new file mode 100644 index 0000000..de5ed87 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-advanced-recognition-nosse.response.header.txt @@ -0,0 +1,15 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding +content-type: application/json +x-request-id: e72413ae-c147-4904-a63b-c09e87ea133a +x-dashscope-call-gateway: true +x-dashscope-finished: true +x-dashscope-timeout: 298 +req-cost-time: 4125 +req-arrive-time: 1764394624316 +resp-start-time: 1764394628442 +x-envoy-upstream-service-time: 4117 +content-encoding: gzip +date: Sat, 29 Nov 2025 05:37:08 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.body.json new file mode 100644 index 0000000..df6ef56 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.body.json @@ -0,0 +1,29 @@ +{ + "model": "qwen-vl-ocr-latest", + "input":{ + "messages":[ + { + "role": "user", + "content": [ + { + "image": "https://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg" + } + ] + } + ] + }, + "parameters": { + "ocr_options": { + "task": "key_information_extraction", + "task_config": { + "result_schema": { + "乘车日期": "对应图中乘车日期时间,格式为年-月-日,比如2025-03-05", + "发票": { + "发票代码": "提取图中的发票代码,通常为一组数字或字母组合", + "发票号码": "提取发票上的号码,通常由纯数字组成。" + } + } + } + } + } +} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.header.txt new file mode 100644 index 0000000..21b0b1c --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.request.header.txt @@ -0,0 +1,8 @@ +POST /api/v1/services/aigc/multimodal-generation/generation HTTP/1.1 +Content-Type: application/json +Accept: */* +Cache-Control: no-cache +Host: dashscope.aliyuncs.com +Accept-Encoding: gzip, deflate, br +Connection: keep-alive +Content-Length: 940 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.body.txt new file mode 100644 index 0000000..69e4ada --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.body.txt @@ -0,0 +1 @@ +{"output":{"choices":[{"finish_reason":"stop","message":{"content":[{"ocr_result":{"kv_result":{"乘车日期":"2013-06-29","发票":{"发票代码":"221021325353","发票号码":"10283819"}}},"text":"```json\n{\n \"乘车日期\": \"2013-06-29\",\n \"发票\": {\n \"发票代码\": \"221021325353\",\n \"发票号码\": \"10283819\"\n }\n}\n```"}],"role":"assistant"}}]},"usage":{"image_tokens":310,"input_tokens":524,"input_tokens_details":{"image_tokens":310,"text_tokens":214},"output_tokens":65,"output_tokens_details":{"text_tokens":65},"total_tokens":589},"request_id":"5f79aafc-8749-4ea2-b122-7d8541d58b6c"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.header.txt new file mode 100644 index 0000000..9405d72 --- /dev/null +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-key-information-extraction-nosse.response.header.txt @@ -0,0 +1,15 @@ +HTTP/1.1 200 OK +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding +content-type: application/json +x-request-id: 5f79aafc-8749-4ea2-b122-7d8541d58b6c +x-dashscope-call-gateway: true +x-dashscope-finished: true +x-dashscope-timeout: 298 +req-cost-time: 931 +req-arrive-time: 1764405289900 +resp-start-time: 1764405290831 +x-envoy-upstream-service-time: 924 +content-encoding: gzip +date: Sat, 29 Nov 2025 08:34:50 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.body.json b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.body.json index ace7eda..2ab0062 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.body.json +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.body.json @@ -1,14 +1,15 @@ { - "model": "qwen-vl-ocr", + "model": "qwen-vl-ocr-latest", "input":{ "messages":[ { "role": "user", "content": [ { - "image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg", + "image": "https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5727078571/p1006562.png", "min_pixels": 3136, - "max_pixels": 1003520 + "max_pixels": 1003520, + "enable_rotate": true }, {"text": "Read all the text in the image."} ] diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.header.txt index 0d47535..a81f368 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.request.header.txt @@ -5,4 +5,4 @@ Cache-Control: no-cache Host: dashscope.aliyuncs.com Accept-Encoding: gzip, deflate, br Connection: keep-alive -Content-Length: 697 +Content-Length: 720 diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.body.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.body.txt index 9f548bf..a1fd237 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.body.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.body.txt @@ -1,300 +1,775 @@ id:1 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"读者"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":1,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"产品"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":972,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":1,"input_tokens":971,"output_tokens_details":{"text_tokens":1},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:2 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"对象"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":2,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"介绍"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":973,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":2,"input_tokens":971,"output_tokens_details":{"text_tokens":2},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:3 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 如果"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":3,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":974,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":3,"input_tokens":971,"output_tokens_details":{"text_tokens":3},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:4 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"你是"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":4,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"本"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":975,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":4,"input_tokens":971,"output_tokens_details":{"text_tokens":4},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:5 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"Linux环境下的系统"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":8,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"品"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":976,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":5,"input_tokens":971,"output_tokens_details":{"text_tokens":5},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:6 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"管理员,那么学会"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":12,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"采用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":977,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":6,"input_tokens":971,"output_tokens_details":{"text_tokens":6},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:7 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"编写shell脚本"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":16,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"韩国"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":978,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":7,"input_tokens":971,"output_tokens_details":{"text_tokens":7},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:8 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"将让你受益匪"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":20,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"进口"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":979,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":8,"input_tokens":971,"output_tokens_details":{"text_tokens":8},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:9 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"浅。本书并未"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":24,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"纤维"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":980,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":9,"input_tokens":971,"output_tokens_details":{"text_tokens":9},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:10 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"细述安装 Linux"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":28,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"制造"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":981,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":10,"input_tokens":971,"output_tokens_details":{"text_tokens":10},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:11 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"系统的每个步骤,"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":32,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":982,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":11,"input_tokens":971,"output_tokens_details":{"text_tokens":11},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:12 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"但只要系统已"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":36,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":983,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":12,"input_tokens":971,"output_tokens_details":{"text_tokens":12},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:13 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"安装好Linux并"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":40,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"缩水"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":984,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":13,"input_tokens":971,"output_tokens_details":{"text_tokens":13},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:14 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"能运行起来,"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":44,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":985,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":14,"input_tokens":971,"output_tokens_details":{"text_tokens":14},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:15 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"你就可以开始考虑"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":48,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不变"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":986,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":15,"input_tokens":971,"output_tokens_details":{"text_tokens":15},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:16 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"如何让一些日常"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":52,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"形"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":987,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":16,"input_tokens":971,"output_tokens_details":{"text_tokens":16},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:17 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 的系统管理任务"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":56,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":988,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":17,"input_tokens":971,"output_tokens_details":{"text_tokens":17},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:18 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"实现自动化。这时"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":60,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":989,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":18,"input_tokens":971,"output_tokens_details":{"text_tokens":18},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:19 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"shell脚本编程"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":64,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"发"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":990,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":19,"input_tokens":971,"output_tokens_details":{"text_tokens":19},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:20 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"就能发挥作用了,"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":68,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"霉"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":991,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":20,"input_tokens":971,"output_tokens_details":{"text_tokens":20},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:21 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"这也正是本书的作用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":72,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":992,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":21,"input_tokens":971,"output_tokens_details":{"text_tokens":21},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:22 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"所在。本书将"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":76,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":993,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":22,"input_tokens":971,"output_tokens_details":{"text_tokens":22},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:23 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 演示"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":80,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":994,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":23,"input_tokens":971,"output_tokens_details":{"text_tokens":23},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:24 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"如何使用shell脚"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":84,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"生"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":995,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":24,"input_tokens":971,"output_tokens_details":{"text_tokens":24},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:25 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"本来自动处理系统"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":88,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"菌"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":996,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":25,"input_tokens":971,"output_tokens_details":{"text_tokens":25},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:26 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"管理任务,包括"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":92,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":997,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":26,"input_tokens":971,"output_tokens_details":{"text_tokens":26},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:27 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"从监测系统统计数据"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":96,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":998,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":27,"input_tokens":971,"output_tokens_details":{"text_tokens":27},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:28 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"和数据文件到"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":100,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"伤"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":999,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":28,"input_tokens":971,"output_tokens_details":{"text_tokens":28},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:29 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"为你的老板"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":104,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"物品"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1000,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":29,"input_tokens":971,"output_tokens_details":{"text_tokens":29},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:30 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 生成报表。 如果"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":108,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"表面"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1001,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":30,"input_tokens":971,"output_tokens_details":{"text_tokens":30},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:31 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"你是家用Linux爱好者"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":112,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1002,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":31,"input_tokens":971,"output_tokens_details":{"text_tokens":31},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:32 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":",同样能从"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":116,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"具有"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1003,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":32,"input_tokens":971,"output_tokens_details":{"text_tokens":32},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:33 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"本书中获益"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":120,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"真正的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1004,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":33,"input_tokens":971,"output_tokens_details":{"text_tokens":33},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:34 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"。现今,用户"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":124,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"不"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1005,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":34,"input_tokens":971,"output_tokens_details":{"text_tokens":34},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:35 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"很容易在诸多部件"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":128,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"粘"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1006,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":35,"input_tokens":971,"output_tokens_details":{"text_tokens":35},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:36 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"堆积而成的图形"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":132,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"油"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1007,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":36,"input_tokens":971,"output_tokens_details":{"text_tokens":36},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:37 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"环境 中迷失。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":136,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1008,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":37,"input_tokens":971,"output_tokens_details":{"text_tokens":37},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:38 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"大多数桌面Linux发行"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":140,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"吸"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1009,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":38,"input_tokens":971,"output_tokens_details":{"text_tokens":38},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:39 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"版都尽量向"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":144,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"水"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1010,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":39,"input_tokens":971,"output_tokens_details":{"text_tokens":39},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:40 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"一般用户隐藏系统的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":148,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"力"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1011,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":40,"input_tokens":971,"output_tokens_details":{"text_tokens":40},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:41 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"内部细节。但"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":152,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"强"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1012,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":41,"input_tokens":971,"output_tokens_details":{"text_tokens":41},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:42 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"有时你确实需要"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":156,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1013,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":42,"input_tokens":971,"output_tokens_details":{"text_tokens":42},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:43 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"知道内部 发生"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":160,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"耐"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1014,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":43,"input_tokens":971,"output_tokens_details":{"text_tokens":43},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:44 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"了什么。本书"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":164,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"水"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1015,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":44,"input_tokens":971,"output_tokens_details":{"text_tokens":44},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:45 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"将告诉你如何启动"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":168,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1016,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":45,"input_tokens":971,"output_tokens_details":{"text_tokens":45},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:46 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"Linux命令行以及"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":172,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"浸"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1017,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":46,"input_tokens":971,"output_tokens_details":{"text_tokens":46},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:47 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"接下来要做什么。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":176,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1018,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":47,"input_tokens":971,"output_tokens_details":{"text_tokens":47},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:48 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"通常,如果是执行"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":180,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"清洗"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1019,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":48,"input_tokens":971,"output_tokens_details":{"text_tokens":48},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:49 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"一些简单任"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":184,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"干净"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1020,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":49,"input_tokens":971,"output_tokens_details":{"text_tokens":49},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:50 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 务(比如文件"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":188,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1021,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":50,"input_tokens":971,"output_tokens_details":{"text_tokens":50},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:51 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"管理) , 在"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":192,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"无"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1022,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":51,"input_tokens":971,"output_tokens_details":{"text_tokens":51},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:52 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"命令行下操作"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":196,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"毒"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1023,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":52,"input_tokens":971,"output_tokens_details":{"text_tokens":52},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:53 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"要比在华丽的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":200,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1024,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":53,"input_tokens":971,"output_tokens_details":{"text_tokens":53},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:54 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"图形界面下方便"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":204,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"无"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1025,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":54,"input_tokens":971,"output_tokens_details":{"text_tokens":54},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:55 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"得多。在命令"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":208,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"残留"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1026,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":55,"input_tokens":971,"output_tokens_details":{"text_tokens":55},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:56 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"行下有大量的命令"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":212,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1027,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":56,"input_tokens":971,"output_tokens_details":{"text_tokens":56},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:57 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":" 可供使用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":216,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"易"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1028,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":57,"input_tokens":971,"output_tokens_details":{"text_tokens":57},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:58 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":",本书将会展示"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":220,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"晾"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1029,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":58,"input_tokens":971,"output_tokens_details":{"text_tokens":58},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:59 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[{"text":"如何使用它们。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"input_tokens":1248,"output_tokens":224,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"干"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1030,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":59,"input_tokens":971,"output_tokens_details":{"text_tokens":59},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} id:60 event:result :HTTP_STATUS/200 -data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"input_tokens":1248,"output_tokens":225,"image_tokens":1219},"request_id":"fb33a990-3826-9386-8b0a-8317dfc38c1c"} +data:{"output":{"choices":[{"message":{"content":[{"text":"等特点"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1031,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":60,"input_tokens":971,"output_tokens_details":{"text_tokens":60},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:61 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"。\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1032,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":61,"input_tokens":971,"output_tokens_details":{"text_tokens":61},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:62 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"店"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1033,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":62,"input_tokens":971,"output_tokens_details":{"text_tokens":62},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:63 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"家"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1034,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":63,"input_tokens":971,"output_tokens_details":{"text_tokens":63},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:64 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"使用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1035,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":64,"input_tokens":971,"output_tokens_details":{"text_tokens":64},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:65 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"经验"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1036,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":65,"input_tokens":971,"output_tokens_details":{"text_tokens":65},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:66 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":":"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1037,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":66,"input_tokens":971,"output_tokens_details":{"text_tokens":66},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:67 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"不锈钢"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1038,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":67,"input_tokens":971,"output_tokens_details":{"text_tokens":67},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:68 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1039,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":68,"input_tokens":971,"output_tokens_details":{"text_tokens":68},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:69 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"陶瓷"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1040,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":69,"input_tokens":971,"output_tokens_details":{"text_tokens":69},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:70 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"制品"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1041,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":70,"input_tokens":971,"output_tokens_details":{"text_tokens":70},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:71 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1042,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":71,"input_tokens":971,"output_tokens_details":{"text_tokens":71},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:72 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"浴"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1043,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":72,"input_tokens":971,"output_tokens_details":{"text_tokens":72},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:73 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"盆"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1044,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":73,"input_tokens":971,"output_tokens_details":{"text_tokens":73},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:74 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"、"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1045,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":74,"input_tokens":971,"output_tokens_details":{"text_tokens":74},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:75 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"整体"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1046,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":75,"input_tokens":971,"output_tokens_details":{"text_tokens":75},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:76 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"浴室"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1047,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":76,"input_tokens":971,"output_tokens_details":{"text_tokens":76},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:77 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"大部分"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1048,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":77,"input_tokens":971,"output_tokens_details":{"text_tokens":77},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:78 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"是"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1049,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":78,"input_tokens":971,"output_tokens_details":{"text_tokens":78},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:79 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1050,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":79,"input_tokens":971,"output_tokens_details":{"text_tokens":79},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:80 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"白色的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1051,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":80,"input_tokens":971,"output_tokens_details":{"text_tokens":80},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:81 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"光"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1052,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":81,"input_tokens":971,"output_tokens_details":{"text_tokens":81},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:82 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"洁"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1053,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":82,"input_tokens":971,"output_tokens_details":{"text_tokens":82},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:83 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"表面"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1054,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":83,"input_tokens":971,"output_tokens_details":{"text_tokens":83},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:84 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1055,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":84,"input_tokens":971,"output_tokens_details":{"text_tokens":84},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:85 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1056,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":85,"input_tokens":971,"output_tokens_details":{"text_tokens":85},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:86 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"其他的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1057,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":86,"input_tokens":971,"output_tokens_details":{"text_tokens":86},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:87 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"抹"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1058,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":87,"input_tokens":971,"output_tokens_details":{"text_tokens":87},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:88 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"布"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1059,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":88,"input_tokens":971,"output_tokens_details":{"text_tokens":88},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:89 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"擦"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1060,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":89,"input_tokens":971,"output_tokens_details":{"text_tokens":89},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:90 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"洗"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1061,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":90,"input_tokens":971,"output_tokens_details":{"text_tokens":90},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:91 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"表面"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1062,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":91,"input_tokens":971,"output_tokens_details":{"text_tokens":91},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:92 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"污"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1063,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":92,"input_tokens":971,"output_tokens_details":{"text_tokens":92},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:93 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"渍"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1064,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":93,"input_tokens":971,"output_tokens_details":{"text_tokens":93},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:94 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"不易"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1065,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":94,"input_tokens":971,"output_tokens_details":{"text_tokens":94},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:95 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"洗"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1066,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":95,"input_tokens":971,"output_tokens_details":{"text_tokens":95},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:96 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"掉"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1067,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":96,"input_tokens":971,"output_tokens_details":{"text_tokens":96},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:97 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1068,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":97,"input_tokens":971,"output_tokens_details":{"text_tokens":97},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:98 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"太"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1069,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":98,"input_tokens":971,"output_tokens_details":{"text_tokens":98},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:99 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"尖"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1070,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":99,"input_tokens":971,"output_tokens_details":{"text_tokens":99},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:100 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1071,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":100,"input_tokens":971,"output_tokens_details":{"text_tokens":100},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:101 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"的"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1072,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":101,"input_tokens":971,"output_tokens_details":{"text_tokens":101},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:102 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"容易"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1073,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":102,"input_tokens":971,"output_tokens_details":{"text_tokens":102},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:103 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"划"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1074,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":103,"input_tokens":971,"output_tokens_details":{"text_tokens":103},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:104 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"出"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1075,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":104,"input_tokens":971,"output_tokens_details":{"text_tokens":104},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:105 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"划"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1076,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":105,"input_tokens":971,"output_tokens_details":{"text_tokens":105},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:106 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"痕"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1077,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":106,"input_tokens":971,"output_tokens_details":{"text_tokens":106},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:107 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"。"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1078,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":107,"input_tokens":971,"output_tokens_details":{"text_tokens":107},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:108 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"使用"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1079,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":108,"input_tokens":971,"output_tokens_details":{"text_tokens":108},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:109 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"这个"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1080,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":109,"input_tokens":971,"output_tokens_details":{"text_tokens":109},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:110 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"仿真"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1081,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":110,"input_tokens":971,"output_tokens_details":{"text_tokens":110},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:111 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"丝"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1082,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":111,"input_tokens":971,"output_tokens_details":{"text_tokens":111},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:112 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"瓜"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1083,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":112,"input_tokens":971,"output_tokens_details":{"text_tokens":112},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:113 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"布"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1084,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":113,"input_tokens":971,"output_tokens_details":{"text_tokens":113},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:114 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1085,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":114,"input_tokens":971,"output_tokens_details":{"text_tokens":114},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:115 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"沾"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1086,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":115,"input_tokens":971,"output_tokens_details":{"text_tokens":115},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:116 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"少量"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1087,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":116,"input_tokens":971,"output_tokens_details":{"text_tokens":116},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:117 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"中"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1088,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":117,"input_tokens":971,"output_tokens_details":{"text_tokens":117},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:118 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"性"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1089,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":118,"input_tokens":971,"output_tokens_details":{"text_tokens":118},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:119 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"洗涤"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1090,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":119,"input_tokens":971,"output_tokens_details":{"text_tokens":119},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:120 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"剂"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1091,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":120,"input_tokens":971,"output_tokens_details":{"text_tokens":120},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:121 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"揉"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1092,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":121,"input_tokens":971,"output_tokens_details":{"text_tokens":121},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:122 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1093,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":122,"input_tokens":971,"output_tokens_details":{"text_tokens":122},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:123 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"出"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1094,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":123,"input_tokens":971,"output_tokens_details":{"text_tokens":123},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:124 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"泡沫"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1095,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":124,"input_tokens":971,"output_tokens_details":{"text_tokens":124},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:125 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":","}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1096,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":125,"input_tokens":971,"output_tokens_details":{"text_tokens":125},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:126 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"很容易"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1097,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":126,"input_tokens":971,"output_tokens_details":{"text_tokens":126},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:127 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"把这些"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1098,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":127,"input_tokens":971,"output_tokens_details":{"text_tokens":127},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:128 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"表面"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1099,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":128,"input_tokens":971,"output_tokens_details":{"text_tokens":128},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:129 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"污"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1100,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":129,"input_tokens":971,"output_tokens_details":{"text_tokens":129},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:130 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"渍"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1101,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":130,"input_tokens":971,"output_tokens_details":{"text_tokens":130},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:131 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"擦"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1102,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":131,"input_tokens":971,"output_tokens_details":{"text_tokens":131},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:132 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"洗干净"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1103,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":132,"input_tokens":971,"output_tokens_details":{"text_tokens":132},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:133 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"。\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1104,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":133,"input_tokens":971,"output_tokens_details":{"text_tokens":133},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:134 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"6"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1105,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":134,"input_tokens":971,"output_tokens_details":{"text_tokens":134},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:135 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"9"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1106,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":135,"input_tokens":971,"output_tokens_details":{"text_tokens":135},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:136 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"4"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1107,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":136,"input_tokens":971,"output_tokens_details":{"text_tokens":136},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:137 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"1"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1108,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":137,"input_tokens":971,"output_tokens_details":{"text_tokens":137},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:138 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"9"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1109,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":138,"input_tokens":971,"output_tokens_details":{"text_tokens":138},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:139 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"9"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1110,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":139,"input_tokens":971,"output_tokens_details":{"text_tokens":139},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:140 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"0"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1111,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":140,"input_tokens":971,"output_tokens_details":{"text_tokens":140},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:141 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"6"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1112,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":141,"input_tokens":971,"output_tokens_details":{"text_tokens":141},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:142 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"1"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1113,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":142,"input_tokens":971,"output_tokens_details":{"text_tokens":142},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:143 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"2"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1114,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":143,"input_tokens":971,"output_tokens_details":{"text_tokens":143},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:144 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"0"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1115,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":144,"input_tokens":971,"output_tokens_details":{"text_tokens":144},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:145 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"2"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1116,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":145,"input_tokens":971,"output_tokens_details":{"text_tokens":145},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:146 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"3"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1117,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":146,"input_tokens":971,"output_tokens_details":{"text_tokens":146},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:147 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"\n"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1118,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":147,"input_tokens":971,"output_tokens_details":{"text_tokens":147},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:148 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"货"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1119,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":148,"input_tokens":971,"output_tokens_details":{"text_tokens":148},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:149 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"号"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1120,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":149,"input_tokens":971,"output_tokens_details":{"text_tokens":149},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:150 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":":"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1121,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":150,"input_tokens":971,"output_tokens_details":{"text_tokens":150},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:151 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"2"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1122,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":151,"input_tokens":971,"output_tokens_details":{"text_tokens":151},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:152 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"0"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1123,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":152,"input_tokens":971,"output_tokens_details":{"text_tokens":152},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:153 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"2"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1124,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":153,"input_tokens":971,"output_tokens_details":{"text_tokens":153},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:154 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[{"text":"3"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1125,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":154,"input_tokens":971,"output_tokens_details":{"text_tokens":154},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} + +id:155 +event:result +:HTTP_STATUS/200 +data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":1126,"input_tokens_details":{"image_tokens":947,"text_tokens":24},"output_tokens":155,"input_tokens":971,"output_tokens_details":{"text_tokens":155},"image_tokens":947},"request_id":"6aaa3c55-98fc-498f-baa5-37ba21a708a3"} diff --git a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.header.txt b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.header.txt index ca1ca40..927f892 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.header.txt +++ b/test/Cnblogs.DashScope.Tests.Shared/RawHttpData/multimodal-generation-vl-ocr-sse.response.header.txt @@ -1,15 +1,14 @@ HTTP/1.1 200 OK -eagleeye-traceid: b382371c2f6a177a3148f0daafa306db -Vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers -X-Request-ID: fb33a990-3826-9386-8b0a-8317dfc38c1c +vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers +x-request-id: 6aaa3c55-98fc-498f-baa5-37ba21a708a3 +content-type: text/event-stream;charset=UTF-8 x-dashscope-call-gateway: true -x-dashscope-timeout: 180 +x-dashscope-timeout: 298 x-dashscope-finished: false -req-cost-time: 961 -req-arrive-time: 1732602722387 -resp-start-time: 1732602723349 -x-envoy-upstream-service-time: 952 -Set-Cookie: acw_tc=fb33a990-3826-9386-8b0a-8317dfc38c1c2967802ac6bc4eab0577862bd43cfc3d;path=/;HttpOnly;Max-Age=1800 -Date: Tue, 26 Nov 2024 06:32:03 GMT -Server: istio-envoy -Transfer-Encoding: chunked +req-cost-time: 1201 +req-arrive-time: 1764334672750 +resp-start-time: 1764334673952 +x-envoy-upstream-service-time: 1196 +date: Fri, 28 Nov 2025 12:57:53 GMT +server: istio-envoy +transfer-encoding: chunked diff --git a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs index 45116d9..bdfc897 100644 --- a/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs +++ b/test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.MultimodalGeneration.cs @@ -1,4 +1,5 @@ -using Cnblogs.DashScope.Core; +using System.Text.Json; +using Cnblogs.DashScope.Core; namespace Cnblogs.DashScope.Tests.Shared.Utils; @@ -22,15 +23,15 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent("You are a helpful assistant.") - }.AsReadOnly()), + }), MultimodalMessage.User( new List { MultimodalMessageContent.ImageContent( "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"), MultimodalMessageContent.TextContent("这个图片是哪里,请用简短的语言回答") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -53,8 +54,7 @@ public static class MultimodalGeneration new( "stop", MultimodalMessage.Assistant( - new List { MultimodalMessageContent.TextContent("海滩。") } - .AsReadOnly())) + new List { MultimodalMessageContent.TextContent("海滩。") })) }), RequestId = "e81aa922-be6c-9f9d-bd4f-0f43e21fd913", Usage = new MultimodalTokenUsage @@ -83,8 +83,8 @@ public static class MultimodalGeneration MultimodalMessageContent.ImageContent( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="), MultimodalMessageContent.TextContent("这个图片是哪里,请用简短的语言回答") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -105,8 +105,7 @@ public static class MultimodalGeneration new( "stop", MultimodalMessage.Assistant( - new List { MultimodalMessageContent.TextContent("海滩。") } - .AsReadOnly())) + new List { MultimodalMessageContent.TextContent("海滩。") })) }), RequestId = "e81aa922-be6c-9f9d-bd4f-0f43e21fd913", Usage = new MultimodalTokenUsage @@ -133,15 +132,15 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent("You are a helpful assistant.") - }.AsReadOnly()), + }), MultimodalMessage.User( new List { MultimodalMessageContent.ImageContent( "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"), MultimodalMessageContent.TextContent("这个图片是哪里,请用简短的语言回答") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -163,7 +162,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "这是一个海滩,有沙滩和海浪。在前景中坐着一个女人与她的宠物狗互动。背景中有海水、阳光及远处的海岸线。由于没有具体标识物或地标信息,我无法提供更精确的位置描述。这可能是一个公共海滩或是私人区域。重要的是要注意不要泄露任何个人隐私,并遵守当地的规定和法律法规。欣赏自然美景的同时请尊重环境和其他访客。") - }.AsReadOnly())) + })) }), RequestId = "13c5644d-339c-928a-a09a-e0414bfaa95c", Usage = new MultimodalTokenUsage @@ -192,8 +191,8 @@ public static class MultimodalGeneration MultimodalMessageContent.ImageContent( "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="), MultimodalMessageContent.TextContent("这个图片是哪里,请用简短的语言回答") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -215,7 +214,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "这是一个海滩,有沙滩和海浪。在前景中坐着一个女人与她的宠物狗互动。背景中有海水、阳光及远处的海岸线。由于没有具体标识物或地标信息,我无法提供更精确的位置描述。这可能是一个公共海滩或是私人区域。重要的是要注意不要泄露任何个人隐私,并遵守当地的规定和法律法规。欣赏自然美景的同时请尊重环境和其他访客。") - }.AsReadOnly())) + })) }), RequestId = "13c5644d-339c-928a-a09a-e0414bfaa95c", Usage = new MultimodalTokenUsage @@ -246,8 +245,8 @@ public static class MultimodalGeneration 3136, 1003520), MultimodalMessageContent.TextContent("Read all the text in the image.") - }.AsReadOnly()), - }.AsReadOnly() + }), + } }, Parameters = new MultimodalParameters { @@ -270,7 +269,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "读者对象 如果你是Linux环境下的系统管理员,那么学会编写shell脚本将让你受益匪浅。本书并未细述安装 Linux系统的每个步骤,但只要系统已安装好Linux并能运行起来,你就可以开始考虑如何让一些日常 的系统管理任务实现自动化。这时shell脚本编程就能发挥作用了,这也正是本书的作用所在。本书将 演示如何使用shell脚本来自动处理系统管理任务,包括从监测系统统计数据和数据文件到为你的老板 生成报表。 如果你是家用Linux爱好者,同样能从本书中获益。现今,用户很容易在诸多部件堆积而成的图形环境 中迷失。大多数桌面Linux发行版都尽量向一般用户隐藏系统的内部细节。但有时你确实需要知道内部 发生了什么。本书将告诉你如何启动Linux命令行以及接下来要做什么。通常,如果是执行一些简单任 务(比如文件管理) , 在命令行下操作要比在华丽的图形界面下方便得多。在命令行下有大量的命令 可供使用,本书将会展示如何使用它们。") - }.AsReadOnly())) + })) }), Usage = new MultimodalTokenUsage { @@ -280,13 +279,190 @@ public static class MultimodalGeneration } }); + public static readonly RequestSnapshot, + ModelResponse> + OcrAdvancedRecognitionNoSse = new( + "multimodal-generation-vl-ocr-advanced-recognition", + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() + { + Messages = new List + { + MultimodalMessage.User( + new List + { + MultimodalMessageContent.ImageContent( + "https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5727078571/p1008252.png"), + }) + } + }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() { Task = "advanced_recognition" } + } + }, + new ModelResponse() + { + RequestId = "e72413ae-c147-4904-a63b-c09e87ea133a", + Output = new MultimodalOutput( + new List() + { + new( + "stop", + MultimodalMessage.Assistant( + new List + { + new( + Text: + "```json\n[\n\t{\"rotate_rect\": [502, 178, 95, 435, 90], \"text\": \"INTERNATIONAL\"},\n\t{\"rotate_rect\": [500, 316, 95, 543, 90], \"text\": \"MOTHER LANGUAGE\"},\n\t{\"rotate_rect\": [502, 462, 95, 109, 90], \"text\": \"DAY\"},\n\t{\"rotate_rect\": [916, 278, 83, 119, 59], \"text\": \"你好!\"},\n\t{\"rotate_rect\": [80, 320, 139, 60, 29], \"text\": \"Привіт!\"},\n\t{\"rotate_rect\": [196, 680, 139, 60, 29], \"text\": \"Bonjour!\"},\n\t{\"rotate_rect\": [68, 760, 139, 51, 29], \"text\": \"Merhaba!\"},\n\t{\"rotate_rect\": [308, 802, 55, 71, 90], \"text\": \"Ciao!\"},\n\t{\"rotate_rect\": [486, 774, 83, 133, 90], \"text\": \"Hello!\"},\n\t{\"rotate_rect\": [672, 824, 47, 49, 90], \"text\": \"Ola!\"},\n\t{\"rotate_rect\": [774, 680, 51, 139, 53], \"text\": \"שלום רב!\"},\n\t{\"rotate_rect\": [918, 726, 51, 113, 62], \"text\": \"Salam!\"}\n]\n```", + OcrResult: new MultimodalOcrResult( + new List + { + new( + "INTERNATIONAL", + new[] { 3009, 532, 285, 2610, 90 }, + new[] { 1704, 390, 4314, 390, 4314, 675, 1704, 675 }), + new( + "MOTHER LANGUAGE", + new[] { 2997, 946, 285, 3258, 90 }, + new[] { 1368, 804, 4626, 804, 4626, 1089, 1368, 1089 }), + new( + "DAY", + new[] { 3009, 1384, 285, 654, 90 }, + new[] { 2682, 1242, 3336, 1242, 3336, 1527, 2682, 1527 }), + new( + "你好!", + new[] { 5493, 832, 279, 825, 73 }, + new[] { 5058, 819, 5670, 633, 5928, 846, 5316, 1032 }), + new( + "Привіт!", + new[] { 477, 959, 886, 197, 15 }, + new[] { 24, 936, 198, 780, 930, 981, 756, 1137 }), + new( + "Bonjour!", + new[] { 1173, 2038, 886, 197, 15 }, + new[] { 720, 2016, 894, 1860, 1626, 2061, 1452, 2217 }), + new( + "Merhaba!", + new[] { 408, 2279, 863, 167, 15 }, + new[] { -30, 2244, 114, 2112, 846, 2313, 696, 2445 }), + new( + "Ciao!", + new[] { 1845, 2404, 165, 426, 90 }, + new[] { 1632, 2322, 2058, 2322, 2058, 2487, 1632, 2487 }), + new( + "Hello!", + new[] { 2913, 2320, 249, 798, 90 }, + new[] { 2514, 2196, 3312, 2196, 3312, 2445, 2514, 2445 }), + new( + "Ola!", + new[] { 4029, 2470, 141, 294, 90 }, + new[] { 3882, 2400, 4176, 2400, 4176, 2541, 3882, 2541 }), + new( + "שלום רב!", + new[] { 4641, 2039, 179, 837, 69 }, + new[] { 4218, 2103, 4884, 1851, 5064, 1974, 4398, 2226 }), + new( + "Salam!", + new[] { 5505, 2176, 168, 719, 75 }, + new[] { 5136, 2190, 5730, 2028, 5874, 2163, 5280, 2325 }) + }, + null)), + })) + }), + Usage = new MultimodalTokenUsage + { + ImageTokens = 1862, + InputTokens = 1895, + InputTokensDetails = new MultimodalInputTokenDetails(ImageTokens: 1862, TextTokens: 33), + OutputTokens = 432, + OutputTokensDetails = new MultimodalOutputTokenDetails(TextTokens: 432), + TotalTokens = 2327 + } + }); + + public static readonly RequestSnapshot, + ModelResponse> + OcrKeyInformationExtractionNoSse = new( + "multimodal-generation-vl-ocr-key-information-extraction", + new ModelRequest() + { + Model = "qwen-vl-ocr-latest", + Input = new MultimodalInput() + { + Messages = new List + { + MultimodalMessage.User( + new List + { + MultimodalMessageContent.ImageContent( + "https://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg"), + }) + } + }, + Parameters = new MultimodalParameters() + { + OcrOptions = new MultimodalOcrOptions() + { + Task = "key_information_extraction", + TaskConfig = new MultimodalOcrTaskConfig() + { + ResultSchema = new Dictionary() + { + { "乘车日期", "对应图中乘车日期时间,格式为年-月-日,比如2025-03-05" }, + { + "发票", + new Dictionary() + { + { "发票代码", "提取图中的发票代码,通常为一组数字或字母组合" }, + { "发票号码", "提取发票上的号码,通常由纯数字组成。" } + } + } + } + } + } + } + }, + new ModelResponse() + { + RequestId = "5f79aafc-8749-4ea2-b122-7d8541d58b6c", + Output = new MultimodalOutput( + new List() + { + new( + "stop", + MultimodalMessage.Assistant( + new List + { + new( + Text: + "```json\n{\n \"乘车日期\": \"2013-06-29\",\n \"发票\": {\n \"发票代码\": \"221021325353\",\n \"发票号码\": \"10283819\"\n }\n}\n```", + OcrResult: new MultimodalOcrResult( + null, + JsonSerializer.Deserialize( + "{\"乘车日期\":\"2013-06-29\",\n\"发票\":{\"发票代码\": \"221021325353\",\"发票号码\": \"10283819\"}}"))), + })) + }), + Usage = new MultimodalTokenUsage + { + ImageTokens = 310, + InputTokens = 524, + InputTokensDetails = new MultimodalInputTokenDetails(ImageTokens: 310, TextTokens: 214), + OutputTokens = 65, + OutputTokensDetails = new MultimodalOutputTokenDetails(TextTokens: 65), + TotalTokens = 589 + } + }); + public static readonly RequestSnapshot, ModelResponse> OcrSse = new( "multimodal-generation-vl-ocr", new ModelRequest { - Model = "qwen-vl-ocr", + Model = "qwen-vl-ocr-latest", Input = new MultimodalInput { Messages = @@ -296,12 +472,13 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.ImageContent( - "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg", + "https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5727078571/p1006562.png", 3136, - 1003520), + 1003520, + true), MultimodalMessageContent.TextContent("Read all the text in the image.") - }.AsReadOnly()), - }.AsReadOnly() + }), + } }, Parameters = new MultimodalParameters { @@ -314,7 +491,7 @@ public static class MultimodalGeneration }, new ModelResponse { - RequestId = "fb33a990-3826-9386-8b0a-8317dfc38c1c", + RequestId = "6aaa3c55-98fc-498f-baa5-37ba21a708a3", Output = new MultimodalOutput( new List { @@ -324,14 +501,17 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent( - "读者对象 如果你是Linux环境下的系统管理员,那么学会编写shell脚本将让你受益匪浅。本书并未细述安装 Linux系统的每个步骤,但只要系统已安装好Linux并能运行起来,你就可以开始考虑如何让一些日常 的系统管理任务实现自动化。这时shell脚本编程就能发挥作用了,这也正是本书的作用所在。本书将 演示如何使用shell脚本来自动处理系统管理任务,包括从监测系统统计数据和数据文件到为你的老板 生成报表。 如果你是家用Linux爱好者,同样能从本书中获益。现今,用户很容易在诸多部件堆积而成的图形环境 中迷失。大多数桌面Linux发行版都尽量向一般用户隐藏系统的内部细节。但有时你确实需要知道内部 发生了什么。本书将告诉你如何启动Linux命令行以及接下来要做什么。通常,如果是执行一些简单任 务(比如文件管理) , 在命令行下操作要比在华丽的图形界面下方便得多。在命令行下有大量的命令 可供使用,本书将会展示如何使用它们。") - }.AsReadOnly())) + "产品介绍\n本品采用韩国进口纤维制造,不缩水、不变形、不发霉、\n不生菌、不伤物品表面。具有真正的不粘油、吸水力强、耐水\n浸、清洗干净、无毒、无残留、易晾干等特点。\n店家使用经验:不锈钢、陶瓷制品、浴盆、整体浴室大部分是\n白色的光洁表面,用其他的抹布擦洗表面污渍不易洗掉,太尖\n的容易划出划痕。使用这个仿真丝瓜布,沾少量中性洗涤剂揉\n出泡沫,很容易把这些表面污渍擦洗干净。\n6941990612023\n货号:2023") + })) }), Usage = new MultimodalTokenUsage { - InputTokens = 1248, - OutputTokens = 225, - ImageTokens = 1219 + InputTokens = 971, + OutputTokens = 155, + ImageTokens = 947, + TotalTokens = 1126, + InputTokensDetails = new MultimodalInputTokenDetails(ImageTokens: 947, TextTokens: 24), + OutputTokensDetails = new MultimodalOutputTokenDetails(TextTokens: 155) } }); @@ -351,15 +531,15 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent("You are a helpful assistant.") - }.AsReadOnly()), + }), MultimodalMessage.User( new List { MultimodalMessageContent.AudioContent( "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), MultimodalMessageContent.TextContent("这段音频在说什么,请用简短的语言回答") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -381,7 +561,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "这段音频在说中文,内容是\"没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网未来没有我互联网\"。") - }.AsReadOnly())) + })) }), Usage = new MultimodalTokenUsage { @@ -407,15 +587,15 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent("You are a helpful assistant.") - }.AsReadOnly()), + }), MultimodalMessage.User( new List { MultimodalMessageContent.AudioContent( "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/2channel_16K.wav"), MultimodalMessageContent.TextContent("这段音频的第一句话说了什么?") - }.AsReadOnly()) - }.AsReadOnly() + }) + } }, Parameters = new MultimodalParameters { @@ -437,7 +617,7 @@ public static class MultimodalGeneration new List { MultimodalMessageContent.TextContent("第一句话说了没有我互联网。") - }.AsReadOnly())) + })) }), Usage = new MultimodalTokenUsage { @@ -469,10 +649,10 @@ public static class MultimodalGeneration "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg" - }.AsReadOnly()), + }), MultimodalMessageContent.TextContent("描述这个视频的具体过程") - }.AsReadOnly()), - }.AsReadOnly() + }), + } }, Parameters = new MultimodalParameters { @@ -495,7 +675,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "这段视频展示了一场足球比赛的精彩瞬间。具体过程如下:\n\n1. **背景**:画面中是一个大型体育场,观众席上坐满了观众,气氛热烈。\n2. **球员位置**:球场上有两队球员,一队穿着红色球衣,另一队穿着蓝色球衣。守门员穿着绿色球衣,站在球门前准备防守。\n3. **射门动作**:一名身穿红色球衣的球员在禁区内接到队友传球后,迅速起脚射门。\n4. **守门员扑救**:守门员看到对方射门后,立即做出反应,向左侧跃出试图扑救。\n5. **进球瞬间**:尽管守门员尽力扑救,但皮球还是从他的右侧飞入了球网。\n\n整个过程充满了紧张和刺激,展示了足球比赛中的精彩时刻。") - }.AsReadOnly())) + })) }), Usage = new MultimodalTokenUsage { @@ -527,10 +707,10 @@ public static class MultimodalGeneration "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg" - }.AsReadOnly()), + }), MultimodalMessageContent.TextContent("描述这个视频的具体过程") - }.AsReadOnly()), - }.AsReadOnly() + }), + } }, Parameters = new MultimodalParameters { @@ -554,7 +734,7 @@ public static class MultimodalGeneration { MultimodalMessageContent.TextContent( "这段视频展示了一场足球比赛的精彩瞬间。具体过程如下:\n\n1. **背景**:画面中是一个大型体育场,观众席上坐满了观众,气氛热烈。\n2. **球员位置**:场上有两队球员,一队穿着红色球衣,另一队穿着蓝色球衣。守门员穿着绿色球衣,站在球门前准备防守。\n3. **射门动作**:一名身穿红色球衣的球员在禁区内接到队友传球后,迅速起脚射门。\n4. **扑救尝试**:守门员看到射门后立即做出反应,向左侧跃出试图扑救。\n5. **进球瞬间**:尽管守门员尽力扑救,但皮球还是从他的右侧飞入了球网。\n\n整个过程充满了紧张和刺激,展示了足球比赛中的精彩时刻。") - }.AsReadOnly())) + })) }), Usage = new MultimodalTokenUsage { @@ -599,7 +779,8 @@ public static readonly MultimodalMessage.Assistant( new List() { - MultimodalMessageContent.TextContent("这个视频展示了一位年轻女性的面部特写,她有着齐肩的棕色短发和刘海,穿着一件粉色针织开衫搭配白色内搭,脖子上戴着一条细小的项链。背景是模糊的城市建筑环境,阳光明媚,整体画面明亮且温暖。\n\n视频的具体过程如下:\n\n1. **初始画面**:视频开始时,女性面带微笑,眼神温和地注视着镜头,表情自然亲切。\n2. **表情变化**:她的笑容逐渐加深,从浅笑过渡到大笑,露出牙齿,显得非常开心和愉悦。\n3. **头部轻微晃动**:在笑的过程中,她的头部有轻微的前后晃动,增加了动态感和真实感。\n4. **眼神交流**:她一直保持与镜头的眼神接触,给人一种直接对话的感觉。\n5. **情绪传递**:整个过程中,她的表情从轻松愉快逐渐变为更加开朗和兴奋,传递出积极正面的情绪。\n6. **结束状态**:视频最后,她的笑容依然灿烂,但稍微收敛了一些,恢复到一个温和的笑容,结束于一个稳定的画面。\n\n整个视频通过细腻的表情变化和自然的动作,展现了人物的亲和力和愉悦心情,营造出一种温暖、阳光的氛围。右上角有“通义·AI合成”的水印,表明这是由AI技术生成的视频内容。") + MultimodalMessageContent.TextContent( + "这个视频展示了一位年轻女性的面部特写,她有着齐肩的棕色短发和刘海,穿着一件粉色针织开衫搭配白色内搭,脖子上戴着一条细小的项链。背景是模糊的城市建筑环境,阳光明媚,整体画面明亮且温暖。\n\n视频的具体过程如下:\n\n1. **初始画面**:视频开始时,女性面带微笑,眼神温和地注视着镜头,表情自然亲切。\n2. **表情变化**:她的笑容逐渐加深,从浅笑过渡到大笑,露出牙齿,显得非常开心和愉悦。\n3. **头部轻微晃动**:在笑的过程中,她的头部有轻微的前后晃动,增加了动态感和真实感。\n4. **眼神交流**:她一直保持与镜头的眼神接触,给人一种直接对话的感觉。\n5. **情绪传递**:整个过程中,她的表情从轻松愉快逐渐变为更加开朗和兴奋,传递出积极正面的情绪。\n6. **结束状态**:视频最后,她的笑容依然灿烂,但稍微收敛了一些,恢复到一个温和的笑容,结束于一个稳定的画面。\n\n整个视频通过细腻的表情变化和自然的动作,展现了人物的亲和力和愉悦心情,营造出一种温暖、阳光的氛围。右上角有“通义·AI合成”的水印,表明这是由AI技术生成的视频内容。") })) }), Usage = new MultimodalTokenUsage()