Skip to content

Commit 32d51c8

Browse files
authored
Merge pull request #110 from cnblogs/update-docs
feat: update readme doc and samples
2 parents ae9208e + 8d17c44 commit 32d51c8

16 files changed

+591
-247
lines changed

README.md

Lines changed: 179 additions & 166 deletions
Large diffs are not rendered by default.

README.zh-Hans.md

Lines changed: 199 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
[English](https://github.com/cnblogs/dashscope-sdk/blob/main/README.md) | 简体中文
22

3+
# Cnblogs.DashScopeSDK
4+
35
[![NuGet Version](https://img.shields.io/nuget/v/Cnblogs.DashScope.AI?style=flat&logo=nuget&label=Cnblogs.DashScope.AI)](https://www.nuget.org/packages/Cnblogs.DashScope.AI)
46
[![NuGet Version](https://img.shields.io/nuget/v/Cnblogs.DashScope.Sdk?style=flat&logo=nuget&label=Cnblogs.DashScope.Sdk&link=https%3A%2F%2Fwww.nuget.org%2Fpackages%2FCnblogs.DashScope.Sdk)](https://www.nuget.org/packages/Cnblogs.DashScope.Sdk)
57
[![NuGet Version](https://img.shields.io/nuget/v/Cnblogs.DashScope.AspNetCore?style=flat&logo=nuget&label=Cnblogs.DashScope.AspNetCore&link=https%3A%2F%2Fwww.nuget.org%2Fpackages%2FCnblogs.DashScope.AspNetCore)](https://www.nuget.org/packages/Cnblogs.DashScope.AspNetCore)
68

7-
# Cnblogs.DashScopeSDK
8-
99
由博客园维护并使用的非官方灵积(百炼)服务 SDK。
1010

1111
使用前注意:当前项目正在积极开发中,小版本也可能包含破坏性更改,升级前请查看对应版本 Release Note 进行迁移。
1212

13-
# 快速开始
13+
## 快速开始
1414

15-
## 使用 `Microsoft.Extensions.AI` 接口
15+
### 使用 `Microsoft.Extensions.AI` 接口
1616

1717
安装 NuGet 包 `Cnblogs.DashScope.AI`
1818

@@ -22,7 +22,7 @@ var completion = await client.CompleteAsync("hello");
2222
Console.WriteLine(completion)
2323
```
2424

25-
## 控制台应用
25+
### 控制台应用
2626

2727
安装 NuGet 包 `Cnblogs.DashScope.Sdk`
2828

@@ -34,7 +34,7 @@ var completion = await client.GetQWenCompletionAsync(QWenLlm.QWenMax, prompt);
3434
Console.WriteLine(completion.Output.Text);
3535
```
3636

37-
## ASP.NET Core 应用
37+
### ASP.NET Core 应用
3838

3939
安装 NuGet 包 `Cnblogs.DashScope.AspNetCore`
4040

@@ -64,70 +64,22 @@ public class YourService(IDashScopeClient client)
6464
}
6565
```
6666

67-
# 支持的 API
67+
## 支持的 API
6868

69-
- 通用文本向量 - `GetTextEmbeddingsAsync()`
70-
- 通义千问(`qwen-turbo``qwen-max` 等) - `GetQWenCompletionAsync()``GetQWenCompletionStreamAsync()`
71-
- DeepSeek 系列模型(`deepseek-r1``deepseek-v3` 等) - `GetDeepSeekChatCompletionAsync()``GetDeepSeekChatCompletionStreamAsync()`
72-
- 百川开源大模型 - `GetBaiChuanTextCompletionAsync()`
73-
- LLaMa2 大语言模型 - `GetLlama2TextCompletionAsync()`
74-
- 通义千问 VL 和通义千问 Audio(`qwen-vl-max``qwen-audio`) - `GetQWenMultimodalCompletionAsync()``GetQWenMultimodalCompletionStreamAsync()`
75-
- 通义万相系列
76-
- 文生图 - `CreateWanxImageSynthesisTaskAsync()``GetWanxImageSynthesisTaskAsync()`
77-
- 人像风格重绘 - `CreateWanxImageGenerationTaskAsync()``GetWanxImageGenerationTaskAsync()`
78-
- 图像背景生成 - `CreateWanxBackgroundGenerationTaskAsync()``GetWanxBackgroundGenerationTaskAsync()`
79-
- 适用于 QWen-Long 的文件 API `UploadFileAsync()``DeleteFileAsync`
80-
- 应用调用 `GetApplicationResponseAsync``GetApplicationResponseStreamAsync()`
81-
- 其他使用相同 Endpoint 的模型
69+
- [对话](#对话) - QWen3, DeepSeek 等,支持推理/工具调用/网络搜索/翻译等场景
70+
- [多模态](#多模态) - QWen-VL,QVQ 等,支持推理/视觉理解/OCR/音频理解等场景
71+
- [语音合成](#语音合成) - CosyVoice,Sambert 等,支持 TTS 等应用场景
72+
- [图像生成](#图像生成) - wanx2.1 等,支持文生图,人像风格重绘等应用场景
73+
- [应用调用](#应用调用)
74+
- [文本向量](#文本向量)
8275

83-
# 示例
84-
85-
查看 [快照文件](./test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs) 获得 API 调用参数示例.
86-
87-
查看 [测试](./test) 获得更多 API 使用示例。
88-
89-
## 文本生成
76+
### 对话
9077

9178
使用 `dashScopeClient.GetTextCompletionAsync``dashScopeClient.GetTextCompletionStreamAsync` 来直接访问文本生成接口。
9279

93-
相关文档:https://help.aliyun.com/zh/model-studio/user-guide/text-generation/
94-
95-
```csharp
96-
var completion = await dashScopeClient.GetTextCompletionAsync(
97-
new ModelRequest<TextGenerationInput, ITextGenerationParameters>
98-
{
99-
Model = "your-model-name",
100-
Input = new TextGenerationInput { Prompt = prompt },
101-
Parameters = new TextGenerationParameters()
102-
{
103-
// control parameters as you wish.
104-
EnableSearch = true
105-
}
106-
});
107-
108-
var completions = dashScopeClient.GetTextCompletionStreamAsync(
109-
new ModelRequest<TextGenerationInput, ITextGenerationParameters>
110-
{
111-
Model = "your-model-name",
112-
Input = new TextGenerationInput { Messages = [TextChatMessage.System("you are a helpful assistant"), TextChatMessage.User("How are you?")] },
113-
Parameters = new TextGenerationParameters()
114-
{
115-
// control parameters as you wish.
116-
EnableSearch = true,
117-
IncreamentalOutput = true
118-
}
119-
});
120-
```
121-
122-
## 单轮对话
80+
针对通义千问和 DeekSeek,我们提供了快捷方法进行调用: `GetQWenChatCompletionAsync` /`GetDeepSeekChatCompletionAsync`
12381

124-
```csharp
125-
var prompt = "你好"
126-
var completion = await client.GetQWenCompletionAsync(QWenLlm.QWenMax, prompt);
127-
Console.WriteLine(completion.Output.Text);
128-
```
129-
130-
## 多轮对话
82+
相关文档:https://help.aliyun.com/zh/model-studio/user-guide/text-generation/
13183

13284
```csharp
13385
var history = new List<ChatMessage>
@@ -144,7 +96,7 @@ var completion = await client.GetQWenChatCompletionAsync(QWenLlm.QWenMax, histor
14496
Console.WriteLine(completion.Output.Choices[0].Message.Content); // The number is 42
14597
```
14698

147-
## 推理
99+
#### 推理
148100

149101
使用推理模型时,模型的思考过程可以通过 `ReasoningContent` 属性获取。
150102

@@ -157,9 +109,7 @@ var completion = await client.GetDeepSeekChatCompletionAsync(DeepSeekLlm.DeepSee
157109
Console.WriteLine(completion.Output.Choices[0]!.Message.ReasoningContent);
158110
```
159111

160-
### QWen3
161-
162-
使用 `TextGenerationParameters.EnableThinking` 决定是否使用模型的推理能力。
112+
对于支持的模型(例如 qwen3),可以使用 `TextGenerationParameters.EnableThinking` 决定是否使用模型的推理能力。
163113

164114
```csharp
165115
var stream = dashScopeClient
@@ -174,7 +124,7 @@ var stream = dashScopeClient
174124
});
175125
```
176126

177-
## 工具调用
127+
#### 工具调用
178128

179129
创建一个可供模型使用的方法。
180130

@@ -241,9 +191,9 @@ Console.WriteLine(completion.Output.Choice[0].Message.Content) // 现在浙江
241191

242192
当模型认为应当调用工具时,返回消息中 `ToolCalls` 会提供调用的详情,本地在调用完成后可以把结果以 `tool` 角色返回。
243193

244-
## 上传文件(QWen-Long
194+
#### 上传文件(qwen-long
245195

246-
需要先提前将文件上传到 DashScope 来获得 Id。
196+
使用长上下文模型时,需要先提前将文件上传到 DashScope 来获得 Id。
247197

248198
```csharp
249199
var file = new FileInfo("test.txt");
@@ -272,7 +222,162 @@ Console.WriteLine(completion.Output.Choices[0].Message.Content);
272222
var deletionResult = await dashScopeClient.DeleteFileAsync(uploadedFile.Id);
273223
```
274224

275-
## 应用调用
225+
### 多模态
226+
227+
使用 `dashScopeClient.GetMultimodalGenerationAsync``dashScopeClient.GetMultimodalGenerationStreamAsync` 来访问多模态文本生成接口。
228+
229+
相关文档:[多模态_大模型服务平台百炼(Model Studio)-阿里云帮助中心](https://help.aliyun.com/zh/model-studio/multimodal)
230+
231+
#### 视觉理解/推理
232+
233+
使用 `MultimodalMessage.User()` 可以快速创建对应角色的消息。
234+
235+
媒体内容可以通过公网 URL 或者 `byte[]` 传入。
236+
237+
```csharp
238+
var image = await File.ReadAllBytesAsync("Lenna.jpg");
239+
var response = dashScopeClient.GetMultimodalGenerationStreamAsync(
240+
new ModelRequest<MultimodalInput, IMultimodalParameters>()
241+
{
242+
Model = "qvq-plus",
243+
Input = new MultimodalInput()
244+
{
245+
Messages =
246+
[
247+
MultimodalMessage.User(
248+
[
249+
MultimodalMessageContent.ImageContent(image, "image/jpeg"),
250+
MultimodalMessageContent.TextContent("她是谁?")
251+
])
252+
]
253+
},
254+
Parameters = new MultimodalParameters { IncrementalOutput = true, VlHighResolutionImages = false }
255+
});
256+
257+
// output
258+
var reasoning = false;
259+
await foreach (var modelResponse in response)
260+
{
261+
var choice = modelResponse.Output.Choices.FirstOrDefault();
262+
if (choice != null)
263+
{
264+
if (choice.FinishReason != "null")
265+
{
266+
break;
267+
}
268+
269+
if (string.IsNullOrEmpty(choice.Message.ReasoningContent) == false)
270+
{
271+
if (reasoning == false)
272+
{
273+
reasoning = true;
274+
Console.WriteLine("<think>");
275+
}
276+
277+
Console.Write(choice.Message.ReasoningContent);
278+
continue;
279+
}
280+
281+
if (reasoning)
282+
{
283+
reasoning = false;
284+
Console.WriteLine("</think>");
285+
}
286+
287+
Console.Write(choice.Message.Content[0].Text);
288+
}
289+
}
290+
```
291+
292+
### 语音合成
293+
294+
通过 `dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync()` 来创建一个语音合成会话。
295+
296+
**注意:使用 using 语句来自动释放会话,或者手动 Dispose 会话,尽量不要重用会话。**
297+
298+
相关文档:[语音合成-CosyVoice_大模型服务平台百炼(Model Studio)-阿里云帮助中心](https://help.aliyun.com/zh/model-studio/cosyvoice-large-model-for-speech-synthesis)
299+
300+
```csharp
301+
using var tts = await dashScopeClient.CreateSpeechSynthesizerSocketSessionAsync("cosyvoice-v2");
302+
var taskId = await tts.RunTaskAsync(
303+
new SpeechSynthesizerParameters { Voice = "longxiaochun_v2", Format = "mp3" });
304+
await tts.ContinueTaskAsync(taskId, "博客园");
305+
await tts.ContinueTaskAsync(taskId, "代码改变世界");
306+
await tts.FinishTaskAsync(taskId);
307+
var file = new FileInfo("tts.mp3");
308+
using var stream = file.OpenWrite();
309+
await foreach (var b in tts.GetAudioAsync())
310+
{
311+
stream.WriteByte(b);
312+
}
313+
314+
stream.Close();
315+
316+
var tokenUsage = 0;
317+
await foreach (var message in tts.GetMessagesAsync())
318+
{
319+
if (message.Payload.Usage?.Characters > tokenUsage)
320+
{
321+
tokenUsage = message.Payload.Usage.Characters;
322+
}
323+
}
324+
325+
Console.WriteLine($"audio saved to {file.FullName}, token usage: {tokenUsage}");
326+
break;
327+
```
328+
329+
### 图像生成
330+
331+
#### 文生图
332+
333+
我们针对通义万相提供了快捷 API `dashScopeClient.CreateWanxImageSynthesisTaskAsync()``GetWanxImageSynthesisTaskAsync()`
334+
335+
图片生成需要数秒到数十秒不等,对于 HTTP 请求来说太长,需要通过任务方式生成。
336+
337+
先使用 `CreateWanxImageSynthesisTaskAsync()` 创建任务,再轮询 `GetWanxImageSynthesisTaskAsync()` 检查任务完成状态。
338+
339+
相关文档:[通义万相2.1文生图V2版API参考_大模型服务平台百炼(Model Studio)-阿里云帮助中心](https://help.aliyun.com/zh/model-studio/text-to-image-v2-api-reference)
340+
341+
```csharp
342+
var prompt = Console.ReadLine();
343+
var task = await dashScopeClient.CreateWanxImageSynthesisTaskAsync(
344+
WanxModel.WanxV21Turbo,
345+
prompt,
346+
null,
347+
new ImageSynthesisParameters { Style = ImageStyles.OilPainting });
348+
Console.WriteLine($"Task({task.TaskId}) submitted, checking status...");
349+
var watch = Stopwatch.StartNew();
350+
while (watch.Elapsed.TotalSeconds < 120)
351+
{
352+
var result = await dashScopeClient.GetWanxImageSynthesisTaskAsync(task.TaskId);
353+
Console.WriteLine($"{watch.ElapsedMilliseconds}ms - Status: {result.Output.TaskStatus}");
354+
if (result.Output.TaskStatus == DashScopeTaskStatus.Succeeded)
355+
{
356+
Console.WriteLine($"Image generation finished, URL: {result.Output.Results![0].Url}");
357+
return;
358+
}
359+
360+
if (result.Output.TaskStatus == DashScopeTaskStatus.Failed)
361+
{
362+
Console.WriteLine($"Image generation failed, error message: {result.Output.Message}");
363+
return;
364+
}
365+
366+
await Task.Delay(500);
367+
}
368+
369+
Console.WriteLine($"Task timout, taskId: {task.TaskId}");
370+
```
371+
372+
#### 人像风格重绘和图像背景生成
373+
374+
与文生图类似,先创建任务,再轮询状态。
375+
376+
人像风格重绘 - `CreateWanxImageGenerationTaskAsync``GetWanxImageGenerationTaskAsync`
377+
378+
图像背景生成 - `CreateWanxBackgroundGenerationTaskAsync``GetWanxBackgroundGenerationTaskAsync`
379+
380+
### 应用调用
276381

277382
`GetApplicationResponseAsync` 用于进行应用调用。
278383

@@ -339,3 +444,25 @@ var request =
339444
var response = await client.GetApplicationResponseAsync("your-application-id", request);
340445
Console.WriteLine(response.Output.Text);
341446
```
447+
448+
### 文本向量
449+
450+
使用 `GetTextEmbeddingsAsync` 来调用文本向量接口。
451+
452+
相关文档:[通用文本向量同步接口API详情_大模型服务平台百炼(Model Studio)-阿里云帮助中心](https://help.aliyun.com/zh/model-studio/text-embedding-synchronous-api)
453+
454+
```csharp
455+
var text = Console.ReadLine();
456+
var response = await dashScopeClient.GetTextEmbeddingsAsync(
457+
TextEmbeddingModel.TextEmbeddingV4,
458+
[text],
459+
new TextEmbeddingParameters() { Dimension = 512, });
460+
var array = response.Output.Embeddings.First().Embedding;
461+
Console.WriteLine("Embedding");
462+
Console.WriteLine(string.Join('\n', array));
463+
Console.WriteLine($"Token usage: {response.Usage?.TotalTokens}");
464+
```
465+
466+
查看 [快照文件](./test/Cnblogs.DashScope.Tests.Shared/Utils/Snapshots.cs) 获得 API 调用参数示例.
467+
468+
查看 [测试](./test) 获得更多 API 使用示例。

sample/Cnblogs.DashScope.Sample/Cnblogs.DashScope.Sample.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
<None Update="test.txt">
1818
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1919
</None>
20+
<None Update="Lenna.jpg">
21+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
22+
</None>
2023
</ItemGroup>
2124

2225
<ItemGroup>
84 KB
Loading

0 commit comments

Comments
 (0)